multiprocessing
モジュールに関するもう1つの質問Python 3.
5.私の問題は、処理されたフォークされたすべてが自分の仕事を完了したことを知っていることです(私はその結果をQueue
で見ることができます)、AsyncResult.result()私がPoolObj.join()を実行すると、それは永遠にかかります。私はPoolObj.terminate()を行い、自分の人生を続けることができると知っていますが、なぜこれが起こるのか知りたいですか?プールへのマップコールが完了しても、プロセスに時間がかかるのはなぜですか?
私は、次のコードを使用しています:
def worker(d):
queue.put(d)
def gen_data():
for i in range(int(1e6)):
yield i
if __name__ == "__main__":
queue = Queue(maxsize=-1)
pool = Pool(processes=12)
pool_obj_worker = pool.map_async(worker, gen_data(), chunksize=1)
pool.close()
print ('Lets run the workers...\n')
while True:
if pool_obj_worker.ready():
if pool_obj_worker.successful():
print ('\nAll processed successfully!') # I can see this quickly, so my jobs are done
else:
print ('\nAll processed. Errors encountered!')
sys.stdout.flush()
print (q.qsize()) # The size is right that means all workers have done their job
pool.join() # will get stuck here for long long time
queue.put('*')
break
print ('%d still to be processed' %
pool_obj_worker._number_left)
sys.stdout.flush()
time.sleep(0.5)
私はそれが間違ってやっているの?私を教えてください。または、join()
のプロセスがゾンビになっていますか?
あなたがキューに入れしようとしているもののサイズを小さくする場合はどうなりますか? – roganjosh
1e5と1e4の値が小さい場合でも問題があります。しかし、これらより小さい値の場合、問題はそれほど明白ではありません。 – Parashar
それを '10'に減らしてみてください。少なくとも完了しているのですか、それともまだぶら下がっていますか?これは、[この](https://bugs.python.org/issue8426)に関連している可能性が、私は[こちら](http://stackoverflow.com/questions/38961584/multiprocesses-become-zombie-processes同様の問題がありました - 増加 - 反復 - 何が - ) - しかし、 'プロセス'を使用しています。あなたのケースでは、キューが正しいサイズであると言っているので、何か他のことが起こっているかもしれませんが、正しい方向に向けるかもしれません。また、 '.join() 'がなくてもどうなりますか? – roganjosh