12

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高い、または「より」信頼性が高いですか?Queuetask_done()

そのようなアプローチは正しいと見なすことができますか、それともコールバックを使用したアプローチ (子の間の共有パイプ エンドポイントを介して) がより適切でしょうか?

4

1 に答える 1

7

直接的な答えではありませんが、保護条件を使用して入力キューを反復処理することにますます依存するようになりました。multiprocessing モジュールのドキュメントに例があります。

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

したがって、キューへの入力が完了すると、プロセスを開始したのとput同じ数のSTOP文字列または選択したガードをキューに入れるだけです。

于 2013-02-18T14:22:31.550 に答える