Python docsから直接:
class multiprocessing.Queue([最大サイズ])
...
qsize() キューのおおよそのサイズを返します。マルチスレッド/マルチプロセッシングのセマンティクスのため、この数値は信頼できません。
empty() キューが空の場合は True を返し、そうでない場合は False を返します。マルチスレッド/マルチプロセッシングのセマンティクスのため、これは信頼できません。
そして、私は経験的に、これがQueue
、特に について非常に真実であることを発見しましたempty()
。
私のコードには、一連のプロセス(それぞれが同じマスタープロセスの子)があり、それぞれのrun
メソッドに次のものがあります。
while self.active:
if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0):
try:
self.exclusive_queue.put(self.general_queue.get(timeout=self.queue_timeout))
except Queue.Empty as empty_queue:
continue
else:
task = self.exclusive_queue.get()
self.compute(task)
基本的に、プロセスはgeneral_queue
で作業を待ちますが、最初に をチェックしexclusive_queue
ます。マスター プロセスは、タスクをプロセスの一般キューまたは専用キューに入れることができます。さて、 では、if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0)
最初に を使用しましたが、self.exclusive_queue.empty()
これは非常に奇妙な動作 ( qsize()
30+ およびempty() = True
) をもたらしました。
だから私がこれに向かっているところは -multiprocessing.queues.SimpleQueue
ドキュメントに書かれているからです:
empty() キューが空の場合は True を返し、そうでない場合は False を返します。
信頼性についてはまったく言及されていません。SimpleQueue.empty() は信頼できますか?
そして2番目は、メカニズムのためよりも信頼性がmultiprocessing.JoinableQueue
高い、または「より」信頼性が高いですか?Queue
task_done()
そのようなアプローチは正しいと見なすことができますか、それともコールバックを使用したアプローチ (子の間の共有パイプ エンドポイントを介して) がより適切でしょうか?