似乎python(python 3)队列将被大数据卡住,请参见以下示例:
import multiprocessing as mp
import numpy as np
class Tester:
data = None
def __init__(self):
self.data = np.zeros((1000,1000))
def __str__(self):
return '%f %s' % (self.num, self.name)
def mod(test, out_queue):
test.num = np.random.randn()
out_queue.put(test)
if __name__ == '__main__':
num = 10
out_queue = mp.Queue()
tests = []
for it in range(num):
tests.append(Tester())
workers = [ mp.Process(target=mod, args=(test, out_queue)) for test in tests]
for work in workers: work.start()
for work in workers: work.join()
res_lst = []
for j in range(len(workers)):
res_lst.append(out_queue.get())
上面的代码将导致我的计算机上的死锁,更改1000
为10
可以解决问题。
这是怎么回事
在消耗掉队列中的所有数据之前加入子进程可能会导致死锁,因为子进程将等待从队列中删除所有数据后才能终止。同时,父级将被阻止等待子级终止-之所以不会发生,是因为父级没有从队列中使用子级的数据。
解决方案是在父级使用完队列中的所有数据后加入子级进程。其中包括尚未入队的数据。所以随便走
for work in workers: work.join()
到文件末尾,它将起作用。
这不是完美的,因为您需要确保从子级中删除所有来自子级的数据。但幸运的是,您的情况还可以,因为Queue.put()
每个孩子都有一个。如果有多个大的“ put”,则父进程将不会收集第二个及后续的“ puts”,并且将发生死锁条件。
《多处理编程指南》中的“使用队列的联接过程”一节中的示例对此进行了说明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句