Bonjour,
je voudrais savoir à quoi sert la primitive select.select() en python (si possible des exemples d'utilisation.
Adam.
Bonjour,
je voudrais savoir à quoi sert la primitive select.select() en python (si possible des exemples d'utilisation.
Adam.
Bonjour adamsony,
pour voir ce que fait select.select() tu peux essayer ce qui suit:
de ce que j'ai compris, c'est une interface qui permet de faire la même chose qu'en C, c'est à dire gérer une pool de descripteurs de fichiers typiquement utilisée pour gérer plusieurs sources dans un seul processus/thread.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 import select help(select.select)
on peut donc par exemple lire plusieur fichier et y écrire en une fois c'est çà?
Salut
Pour des exemples voir D.Hellman.
- W
le module select est l'équivalent de la fonction select() en C
ok, mais il prend quoi exactement en paramètre car je comprend rien sur ce point, es ce un descripteur de fichier ou une liste de descripteur de fichier?
Salut,
Entre autres!
Par défaut, les primitives .read, .write sont "synchrones": tant que l'opération d'entrée sortie (IO) n'est pas terminée, le programme attend.
.select permet de supporter un mode asynchrone.
.read et .write lancent l'IO et redonnent la main au programme avant que l'IO soit terminée.
.select va permettre de "scruter" les différents "file descriptors" - fd -en attente pour savoir si une des IO en cours est terminée ou si une error a été retournée.
"file descriptors" = fichiers, sockets, ou autre objet se conformant à cette interface/API.
Sauf dans les cas "simples", la mise en œuvre de cette fonctionnalité est assez délicate car elle impose la création d'un contexte explicite pour gérer l'état de chaque fd afin de savoir quelle opération lancer à la fin de l'IO => une sorte de mécanique d'ordonnancement.
En Python, le module asyncore propose des primitives qui permettent de ne pas avoir à tout coder, voir les exemples de Hellmann
Une autre solution est d'associer les files descriptors à des "threads" et d'utiliser l'API "synchrone": pendant que la thread attend que l'IO se termine, d'autres threads peuvent "bosser".
Le contexte est alors géré implicitement par la thread et l'ordonnancement fait par l'OS.
C'est moins de lignes de code à écrire et à mettre au point.
note: En Python le module asyncore rend la chose aisée mais il faudra quand même écrire plus de lignes de code qu'en passant par les threads.
Cette "simplicité" a (bien sûr) des impacts côté performance.
En gros, avec quelques dizaines de "file descriptors", leur dédier une thread sera "acceptable" au regard du nombre de ligne de code "économisées".
Avec des milliers de "file descriptors", l'overhead sera sensible.
Pire, à l'instant T, il ne pourra y avoir plus de threads "actifs" que de CPU dans le système => Python, de base, réduit le nombre de CPU à 1.
Dans ce cas, on essaiera de limiter le nombre de threads en fonction du nombre de CPU. Ce qui conduit à spécialiser chaque thread à réaliser une partie des traitements associés à chaque "fd". Et créer contexte/état explicite et ordonnanceur pour dispatcher le boulot.
En Python, cela est réalisé par la bibliothèque "Twisted" via la réalisation d'un pattern de programmation appelé "reactor" voir exemple
- W
PS: select est "obsolète", kevent is "better".
La différence étant qu'avec un grands nombre fd, les implications du passage à l'OS du grosse liste de fds avec un retour dès que l'état de l'un d'entre eux change, signifie pooler l'état de l'ensemble à chaque retour.
Avec beaucoup de fd, beaucoup de boulot à chaque aller retour pour 0 informations (les idles on s'en fout).
kevent permet au programme d'être notifié d'un change sur chaque fd.
Moins de boulot pour supporter l'interface => OS et programme s'en portent mieux.
j'ai essayer cela et sa se compile pas(il s'arrête à la ligne du os.open) :
merci beaucoup pour la reponse
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 import os,sys,select if __name__=="__main__" : os.mkfifo("co",0600) fif=os.open("co",os.O_WRONLY) l=[] l.append(fif) c=select.select([],l,[]) print "%d" %(c) unlink("co") sys.exit()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager