基本上我有以下代码:
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