2017-05-28 7 views
1

におけるマルチプロセッシング・プロセスのタイムアウトを実装する:私は何を期待は私のPython

import multiprocessing as mp 
q = mp.Queue() 
p = mp.Process(target=lambda x: x, args=('foo',)) 
p.start() 
p.join(10) 
if p.exitcode == 0: 
    q.get() 
else: 
    print("We timed out.") 

は私の小さなx->x機能は最大10秒間ブロックすることです。それ以前に終了した場合は、その結果をすぐに取得します。それよりも時間がかかる場合(明らかにこのおもちゃの例ではないが、他の場合)、プロセスは10秒後に終了し、実際にタイムアウトしたことを確認するためにexitcodeをチェックすることができます。

しかし、このコードを実行すると、代わりにq.get()が永遠に実行されます。なぜこれが起こるのですか?

答えて

1

q.get()は、デフォルトでブロックするので永遠に実行され、決してキューに何も入れません。

q.get(block=False)またはq.get_nowait()(これは前者と同等です)を使用できます。しかし、それはqueue.Emptyを上げることを忘れないでください。