IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Est-il possible de se passer de select?


Sujet :

Python

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut Est-il possible de se passer de select?
    Bonjour à tous!
    Je suis toujours penché sur l'analyse de l'exemple ci-après tiré du livre de D.M.Beazley 'Python essential reference' et je m'aperçois qu'en commentant la ligne 89 et en ajoutant les deux suivantes, la connexion au serveur reste suspendue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    import select
    import types
    import collections
     
    # Object that represents a running task
    class Task(object):
    	def __init__(self,target):
    		self.target = target 	# A coroutine
    		self.sendval = None 	# Value to send when resuming
    		self.stack = []		# Call stack
     
    	def run(self):
    		try:
    			result = self.target.send(self.sendval)
    			if isinstance(result,SystemCall):
    				return result
    			if isinstance(result,types.GeneratorType):
    				self.stack.append(self.target)
    				self.sendval = None
    				self.target = result
    			else:
    				if not self.task: return
    				self.sendval = result
    				self.target = self.stack.pop()
    		except StopIteration:
    			if not self.stack: raise
    			self.sendval = None
    			self.target = self.stack.pop()
     
    # Object that represents a "system call"
    class SystemCall(object):
    	def handle(self,sched,task): pass
     
    # Implementation of different system calls
    class ReadWait(SystemCall):
    	def __init__(self,f):
    		self.f = f
    	def handle(self,sched,task):
    		fileno = self.f.fileno()
    		sched.readwait(task,fileno)
     
    class WriteWait(SystemCall):
    	def __init__(self,f):
    		self.f = f
    	def handle(self,sched,task):
    		fileno = self.f.fileno()
    		sched.writewait(task,fileno)
     
    class NewTask(SystemCall):
    	def __init__(self,target):
    		self.target = target
    	def handle(self,sched,task):
    		sched.new(self.target)
    		sched.schedule(task)
     
    # Scheduler object
    class Scheduler(object):
    	def __init__(self):
    		self.task_queue = collections.deque()
    		self.read_waiting = {}
    		self.write_waiting = {}
    		self.numtasks = 0
     
    	# Create a new task out of a coroutine
    	def new(self,target):
    		newtask = Task(target)
    		self.schedule(newtask)
    		self.numtasks += 1
     
    	# Put a task on the task queue
    	def schedule(self,task):
    		self.task_queue.append(task)
     
    	# Have a task wait for data on a file descriptor
    	def readwait(self,task,fd):
    		self.read_waiting[fd] = task
     
    	# Have a task wait for writing on a file descriptor
    	def writewait(self,task,fd):
    		self.write_waiting[fd] = task
     
    	# Main scheduler loop
    	def mainloop(self,count=-1,timeout=None):
    		while self.numtasks:
    			# Check for I/O events to handle
    			if self.read_waiting or self.write_waiting:
    				wait = 0 if self.task_queue else timeout
    				#r,w,e = select.select(self.read_waiting,self.write_waiting,[],wait)
                                    r = self.read_waiting.keys()
                                    w = self.write_waiting.keys()
    				for fileno in r:
    					self.schedule(self.read_waiting.pop(fileno))
    				for fileno in w:
    					self.schedule(self.write_waiting.pop(fileno))
    			# Run all the tasks on the queue that are ready to run
    			while self.task_queue:
    				task = self.task_queue.popleft()
    				try:
    					result = task.run()
    					if isinstance(result,SystemCall):
    						result.handle(self,task)
    					else:
    						self.schedule(task)
    				except StopIteration:
    						self.numtasks -= 1
    			# If no tasks can run, we decide if we wait or return
    			else:
    				if count > 0: count -= 1
    				if count == 0: return
     
    if __name__ == '__main__':
    	from socket import socket, AF_INET, SOCK_STREAM
     
    	def time_server(address):
    		import time
    		s = socket(AF_INET,SOCK_STREAM)
    		s.bind(address)
    		s.listen(5)
    		while True:
    			yield ReadWait(s)
    			conn, addr = s.accept()
    			print("Connection from %s " % str(addr))
    			yield WriteWait(conn)
    			resp = time.ctime() + "\r\n"
    			conn.send(resp.encode('latin-1'))
    			conn.close()
     
    	sched = Scheduler()
    	sched.new(time_server(('',10000))) # Server on port 10000
    	sched.new(time_server(('',11000))) # Server on port 11000
    	sched.mainloop()
    Pourquoi ne puis-je pas lire les données des dictionnaires sans utiliser select?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Krishna Voir le message
    Pourquoi ne puis-je pas lire les données des dictionnaires sans utiliser select?
    Dans le cas général, une fonction doit être appelée pour que les paramètres aient quelque chance d’être mis a jour.
    Dans le cas du select, Python n'est qu'un langage de programmation. Les sockets sont réalisées par l'OS.
    Le module socket est juste une interface qui permet d'utiliser cette fonctionnalité de l'OS depuis votre script.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Serait-il donc possible d'envisager un pseudo serveur utilisant la technique du 'micro threading' sans l'appui de select ou kevent si l'on envisage un schéma comme:
    client < -- Pipe -- > serveur ? Si j'ai compris votre réponse, en utilisant un schéma de serveur ne faisant pas intervenir d'appel système, cela devrait fonctionner non?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Krishna Voir le message
    client < -- Pipe -- > serveur ? Si j'ai compris votre réponse, en utilisant un schéma de serveur ne faisant pas intervenir d'appel système, cela devrait fonctionner non?
    Si client et serveur ne sont pas dans un même "processus" impossible de ne pas s'appuyer sur des primitives systèmes pour les faire communiquer.
    Mais honnêtement, je ne comprends pas trop ce que vous chercher a faire.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Bonsoir,
    Je tache juste de cerner au plus près le concept de 'micro threading' et je me demandais s'il était possible et utile de l'utiliser en dehors du champ client/serveur. Par exemple lorsqu'un programme utilise des threads est-il possible et avantageux d'appliquer cette technique?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Krishna Voir le message
    Bonsoir,
    Je tache juste de cerner au plus près le concept de 'micro threading' et je me demandais s'il était possible et utile de l'utiliser en dehors du champ client/serveur. Par exemple lorsqu'un programme utilise des threads est-il possible et avantageux d'appliquer cette technique?
    Les "threads" voila encore une fonctionnalité de l'OS qui n'est pas si "micro" puisque c'est l'OS qui ordonnance en pre-emptif.
    Pour aller dans le "micro", Python dispose d'une fonctionnalité appelée generator ou coroutines et on peut utiliser cela en "cooperatif".

    Pour paralléliser et profiter d'un maximum de ressources CPU, il faut mélanger les techniques. Mais comme c'est complique a mettre au point, on évite d'y aller "juste pour le fun"
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    En écrivant 'micro threading' je veux justement parler de coroutine. Sont-elles donc une alternative aux threads? Et si oui dans quelles limites?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Krishna Voir le message
    En écrivant 'micro threading' je veux justement parler de coroutine. Sont-elles donc une alternative aux threads? Et si oui dans quelles limites?
    Ce genre de sujet n'est pas très spécifique a la programmation Python.

    C'est un sujet très ancien - dans le monde de l'informatique - qui va et vient depuis les années 70s et qui a fait l'objet de nombreuses publications et débats en tout genre que vous devriez pouvoir retrouver en surfant sur Google ou en passant du temps a lire des bouquins d'une bonne librairie.

    Pour faire simple ce sont des techniques.
    Ces techniques ne sont nécessaires que dans des classes d'applications plutôt gourmandes en ressources. Leurs buts étant de proposer des mécanismes pour allouer au mieux ces ressources parce qu'elles ont un coût.
    Si vous n’êtes pas encore capable d'estimer le coût de n-threads par rapport a celui de n-coroutines, vous n’êtes pas prêt d'en trouver les limites et d'avoir vraiment besoin de savoir choisir.
    Mais, ne vous faites pas trop de bile sur cela, il n'y a que quelques milliers d'humains vivants sur la planète qui savent de quoi ils parlent lorsqu'ils abordent ces sujets.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Désolé j'étais ailleurs!
    Merci pour les éléments de réponse et le lien.
    J'aimerais bien faire parti un jour de ces quelques milliers d'humain....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Est-ce possible de se passer du fichier appConfig ?
    Par thomaas dans le forum Entity Framework
    Réponses: 14
    Dernier message: 23/05/2012, 16h21
  2. Réponses: 9
    Dernier message: 01/03/2007, 15h13
  3. Faire passer une variable à un CSS, est-ce possible?
    Par miltonis dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 04/10/2006, 16h05
  4. Réponses: 7
    Dernier message: 09/05/2006, 11h30
  5. Select case est-il possible dans ce cas ?
    Par rangernoir dans le forum Access
    Réponses: 10
    Dernier message: 30/09/2005, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo