Python Queue get()/task_done() issue
Question:
My consumer side of the queue:
m = queue.get()
queue.task_done()
<rest of the program>
Questions:
-
Does task_done()
effectively pops m
off the queue and release whatever locks the consumer has on the queue?
-
I need to use m
during the rest of the program. Is it safe, or do I need to copy it before I call task_done()
or is m
usable after task_done()
?
be happy
Answers:
No, queue.get()
pops the item off the queue. After you do that, you can do whatever you want with it, as long as the producer works like it should and doesn’t touch it anymore. queue.task_done()
is called only to notify the queue that you are done with something (it doesn’t even know about the specific item, it just counts unfinished items in the queue), so that queue.join()
knows the work is finished.
My consumer side of the queue:
m = queue.get()
queue.task_done()
<rest of the program>
Questions:
-
Does
task_done()
effectively popsm
off the queue and release whatever locks the consumer has on the queue? -
I need to use
m
during the rest of the program. Is it safe, or do I need to copy it before I calltask_done()
or ism
usable aftertask_done()
?
be happy
No, queue.get()
pops the item off the queue. After you do that, you can do whatever you want with it, as long as the producer works like it should and doesn’t touch it anymore. queue.task_done()
is called only to notify the queue that you are done with something (it doesn’t even know about the specific item, it just counts unfinished items in the queue), so that queue.join()
knows the work is finished.