基本的に私は次のコードを持っています:
import multiprocessing
import time
class MyProcess(multiprocessing.Process):
def __init__(self, ):
multiprocessing.Process.__init__(self)
self.queue = multiprocessing.Queue()
def run(self):
print "Subprocess starting!"
time.sleep(4)
print "Subprocess exiting!"
def addToQueue(self):
starttime = time.time()
count=0
print "Adding stuff to queue..."
while time.time()-starttime < 4:
self.queue.put("string")
count += 1
print "Added %d objects!" % count
#self.queue.close()
if __name__ == "__main__":
process = MyProcess()
process.start()
print "Waiting for a while"
time.sleep(2)
process.addToQueue()
time.sleep(1)
print "Child process state: %d" % process.is_alive()
メインプロセスが終了しても、終了しません。何も起こりません、それはただブロックします。私がやめたのはそれを殺すことだけでした(SIGTERM、SIGKILLではありません)。
そのコメント行を使用すると、終了しますが、IOErrorが発行されます。
multiprocessing.queueのコードを調べたところ、別のスレッド(threading.Thread)で生成されたos.pipe()が使用されています。私が疑うのは、パイプへの書き込み時にスレッドがブロックされ、close()メソッドが使用されると、IOErrorが発生することです。
だから私の質問は:これを処理するためのよりクリーンな方法はありますか?
つまり、キューが常に書き込まれているこのシナリオがあります。受信プロセスが(クリーンかどうかにかかわらず)終了したら、キューを閉じて送信プロセスでIOErrorを取得する必要がありますか?
編集:プロセスの出力
Waiting for a while
Subprocess starting!
Adding stuff to queue...
Subprocess exiting!
Added 1822174 objects!
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed
send(obj)
IOError: [Errno 32] Broken pipe
Child process state: 0
この部分は、コメント化されたself.queue.close()を使用する場合にのみ発生します。
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed
send(obj)
IOError: [Errno 32] Broken pipe