0

Python でマルチプロセッシングを使用して、関数をループ内で呼び出し続け、その後関数からの最新の戻り値にアクセスしようとしています (値を LIFO キューに格納することにより)。

メイン プログラムのコード スニペットを次に示します。

q = Queue.LifoQueue()
while True:
   p = multiprocessing.Process(target=myFunc, args = (q))
   p.daemon = True
   p.start()
   if not q.empty():
      #do something with q.get()

myFunc のコード スニペットを次に示します。

def myFunc(q):
    x = calc()
    q.put(x)

問題は、メイン ループが q が空であると見なすことです。ただし、(q.put(x) の直後に q.empty() チェックを入れることによって) myFunc() が q に値を配置しているかどうかを確認しましたが、キューは空であってはなりません。

メインループがキューに配置された値を確認できるようにするにはどうすればよいですか? それとも、非効率的な方法でこれを行っていますか? (ただし、myFunc は少し遅く、メイン ループはそのタスクを実行し続ける必要があるため、myFunc とメイン ループを別々に実行する必要があります)

4

1 に答える 1

1

Queue.LifoQueueマルチプロセッシングには適していませんmultiprocessing.Queueが、このユースケース用に特別に設計されています。つまりQueue.LifoQueue、キューはサブプロセス間で共有されないため、に入れられた値はローカル プロセスでのみ使用可能になります。

代わりに、SyncManager ( SyncManager.list()) からの共有リストを使用することもできます。と だけで使用するappendpop、リストは lifo キューと同じように動作します。

于 2015-08-13T07:41:37.747 に答える