我正在尝试在Python中使用多进程库中的队列。执行以下代码后(打印语句有效),但在调用队列上的join后,进程仍未退出并且仍然处于活动状态。如何终止剩余的进程?
谢谢!
def MultiprocessTest(self):
print "Starting multiprocess."
print "Number of CPUs",multiprocessing.cpu_count()
num_procs = 4
def do_work(message):
print "work",message ,"completed"
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = multiprocessing.JoinableQueue()
for i in range(num_procs):
p = multiprocessing.Process(target=worker)
p.daemon = True
p.start()
source = ['hi','there','how','are','you','doing']
for item in source:
q.put(item)
print "q close"
q.join()
#q.close()
print "Finished everything...."
print "num active children:",multiprocessing.active_children()
for item in iter(q.get, None):
这一行非常关键。它告诉循环在从队列获取None值后退出。这就是使实际进程退出的原因。q.join等待所有task_done调用。p.join等待进程终止,只有在工作进程中断(或者您在进程上调用terminate,但这不太理想)时才会发生。 - underrunmultiprocessing.Process
时指定args=(q,)
,因为这样我们明确地共享了该项——这是一个很好的习惯,可以避免意外共享你不应或无法共享的内容。 - underrun