Je souhaite pouvoir joindre() la classe de la file d'attente mais attendre après un certain temps si l'appel n'est pas encore retourné. Quelle est la meilleure façon de le faire? Est-il possible de le faire en sous-classant la file d'attente \ en utilisant la métaclasse?Ajout d'un argument de délai à la file d'attente de python Queue.join()
Répondre
Subclassing Queue
est probablement le meilleur moyen. Quelque chose comme cela devrait fonctionner (non testé):
def join_with_timeout(self, timeout):
self.all_tasks_done.acquire()
try:
endtime = time() + timeout
while self.unfinished_tasks:
remaining = endtime - time()
if remaining <= 0.0:
raise NotFinished
self.all_tasks_done.wait(remaining)
finally:
self.all_tasks_done.release()
Merci! Où avez-vous reçu des informations sur all_task_done? J'ai regardé dans http://docs.python.org/library/queue.html#module-Queue mais je ne vois aucune mention de ce memeber ... – olamundo
Vous pouvez lire le code source de la file d'attente. Il a un paramètre 'timeout' implémenté pour' put' et 'get', il était assez facile d'étendre' join' pour utiliser une approche similaire. –
Hmm, solution intelligente;) – tuergeist
Tout d'abord, vous devez vous assurer que tous vos fils de travail dans la sortie de file d'attente avec task_done()
Pour mettre en œuvre une fonctionnalité de délai d'attente avec Queue
, vous pouvez envelopper le code de la file d'attente dans un thread et ajouter un délai d'attente pour cette discussion à l'aide Thread.join([timeout])
exemple non testé pour décrire ce que je suggère
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
def queuefunc():
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.setDaemon(True)
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
t = Thread(target=queuefunc)
t.start()
t.join(100) # timeout applies here
La méthode join() est tout au sujet d'attente pour toutes les tâches à accomplir. Si vous ne vous inquiétez pas si les tâches ont effectivement terminé, vous pouvez interroger périodiquement le nombre de tâches inachevées:
stop = time() + timeout
while q.unfinished_tasks and time() < stop:
sleep(1)
Cette boucle existera soit lorsque les tâches sont effectuées ou lorsque le délai d'attente est écoulé.
Raymond
- 1. Python (bibliothèque de création d'image): Rééchantillonner la chaîne comme argument
- 2. Ajout d'un alias de codage à python
- 3. Python File Read + Write
- 4. Délai d'attente Ruby pour Python?
- 5. File d'attente à l'aide de la table
- 6. Python: argument spécifique du décorateur (non lié à la fonction enveloppée)?
- 7. Python 2.6 envoi objet de connexion sur la file d'attente/tubes/etc
- 8. Ajout du support SSL à Python 2.6
- 9. Ajout à l'espace de noms local en Python?
- 10. Implémentation de la file d'attente
- 11. Comment définir le délai d'expiration de smtplib en python 2.4?
- 12. Argument numérique de la commande Eclipse Emacs
- 13. YUI: ajout d'un événement en haut de la file d'attente d'un événement après le chargement de la page?
- 14. Ajout de la licence GNU GPL à C# App
- 15. Ajout de plusieurs lignes à une sortie de fichier texte?
- 16. Conception de file d'attente à plusieurs niveaux
- 17. Ajout de TemplateField à DetailsView
- 18. Ajout d'attributs à un noeud de dojo à la création
- 19. Ajout de la fonction Inline Search à la page Web
- 20. Ajout de la valeur par défaut à la colonne existante
- 21. SQL - Ajout de champs à la requête de tri par
- 22. Batch/CMD: Ajout de fichiers à la liste de démarrage
- 23. Ajout de lignes à la base de données wpf
- 24. Ajout de colonne à l'aide de la migration Subsonic 3.0.0.5
- 25. Ajout de la barre de défilement à JList
- 26. Ajout de GridDropdownColumn à la table de détail Radgrid
- 27. Connexion Oracle/délai d'expiration de la requête
- 28. Ajout de NSInteger à NSMutableData
- 29. constructeur de la classe avec un gabarit argument de type
- 30. Ajout d'un type MIME en python
Vous souhaitez vous assurer que tout bout de fil de travailleur task_done() – tuergeist