2009-10-20 6 views
27

Queue get()/task_done() mon côté consommateur de la file d'attente:python problème

m = queue.get() 
queue.task_done() 

<rest of the program> 

questions:

  1. ne task_done() pops efficacement m au large de la file d'attente et libérer tout verrouille le consommateur a sur la file d'attente? Je dois utiliser m pendant le reste du programme. est-ce sûr ou dois-je le copier avant d'appeler le task_done()? ou, est m utilisable après task_done()?

être heureux

Répondre

47

Non, queue.get() pops l'élément de la file d'attente. Après cela, vous pouvez faire ce que vous voulez, tant que le producteur travaille comme il le devrait et ne le touche plus. queue.task_done() est appelée uniquement pour notifier à la file d'attente que vous avez terminé avec quelque chose (il ne sait même pas sur l'élément spécifique, il compte uniquement les éléments inachevés dans la file d'attente), de sorte que queue.join() sait que le travail est terminé.

+0

Est-ce que 'task_done()' affecte 'qsize()'? Autrement dit, si la file d'attente a une taille limite, quand considère-t-elle l'emplacement "vide", après 'get()' ou après 'task_done()'? – Shai

+3

Le slot est libéré après 'get()', 'task_done()' est juste un utilitaire au-dessus du niveau de la file d'attente, il ne fonctionne pas vraiment avec la file d'attente elle-même. –