la gestion de file par python: Queue ************************************ Python possède le module Queue qui permet de gérer une file d'attente. ce module est très pratique car il intègre sur la file: * le mode de gestion (LIFO, FIFO, Priorité) * la taille de la file * l'ajout et la suppresion d'éléments dans cette file les principales types de queues * Queue.Queue(maxsize=0) * Queue.LifoQueue(maxsize=0) * Queue.PriorityQueue(maxsize=0) on peut pour chaque type de queue indiquer le nombre maximal d'élément les principales fonctions * Queue.qsize() * Queue.empty() * Queue.full() * Queue.put(item[, block[, timeout]]) * Queue.put_nowait(item) * Queue.get([block[, timeout]]) * Queue.get_nowait() * Queue.task_done() * Queue.join() Il faut noter que par défaut la fonction * get qu'un élément existe dans la file pour le donner * put attend qu'une place dans la file se libère une place pour mettre l'élément .. attention: cette attente peut être très longue, il est préférable d'ajouter un timeout exprimé en secondes exemple simple d'utilisation simple .. code-block:: python import Queue q = Queue.Queue() for i in range(5): q.put(i) while not q.empty(): print q.get() le module queue est souvent utilisé avec les Thread. On peut ainsi réaliser des tâches en parallèle avec une synchronisation finale Par exemple on va réaliser 3 tâches, chaque tâche fournit un nombre utilisé par une tâche finale pour réaliser une somme programme réalisant ce travail de façon classique .. code-block:: python import time, random import datetime print datetime.datetime.now() sum = 0 for i in range(0,3): a = random.randint(1, 10) time.sleep(a) sum = sum + a print "somme: ", sum print datetime.datetime.now() le résultat :: 2013-05-25 11:30:31.931000 somme: 16 2013-05-25 11:30:47.931000 En utilisant les thread et les queues pour la synchronisation .. code-block:: python import time, random import datetime import threading, Queue class Calcul(threading.Thread): def __init__(self, q): threading.Thread.__init__(self) self.q = q def run(self): a = random.randint(1, 10) time.sleep(a) self.q.put(a) print datetime.datetime.now() sum= 0 queue = Queue.Queue(3) for i in range(0,3): Calcul(queue).start() while queue.qsize() != 3: time.sleep(0.1) #on attend 100ms for i in range(0,3): sum = sum + queue.get() print "somme: ", sum print datetime.datetime.now() le résultat :: 2013-05-25 11:41:42.756000 somme: 12 2013-05-25 11:41:47.788000 avec la méthode simple il nous aurait fallu 12s il la seulement 5s