2009-10-20 15 views
27
キューの

私の消費者側:のpythonキュー取得()/ task_done()問題

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

<rest of the program> 

質問:

  1. task_done()が効果的にキューからmをポップし、消費者をロック何でも解放しませんキューに入っていますか?

  2. 残りのプログラムではmを使用する必要があります。安全ですか?task_done()に電話する前にコピーする必要がありますか?またはtask_done()の後にmを使用できますか?

キューからアイテムをポップqueue.get()幸せ

答えて

47

いや、なります。あなたがそれをした後、プロデューサーがそれと同じように動作し、もはやそれに触れない限り、あなたが望むものを何でもすることができます。 queue.task_done()は、完了したことをキューに通知するためだけに呼び出されます(キュー内の未完成のアイテムを数えています)。queue.join()は作業が終了したことを認識します。

+0

'task_done()'は 'qsize()'に影響しますか?つまり、キューにサイズ制限がある場合、 'get()'の後か 'task_done()'の後にいつスロットが "空"と見なされますか? – Shai

+3

'get()'の後にスロットが解放され、 'task_done()'はキューレベルより上のユーティリティに過ぎません。キュー自体は実際には機能しません。 –