python子进程死锁

Chong Wang

似乎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())

上面的代码将导致我的计算机上的死锁,更改100010可以解决问题。

这是怎么回事

姆霍克

在消耗掉队列中的所有数据之前加入子进程可能会导致死锁,因为子进程将等待从队列中删除所有数据后才能终止。同时,父级将被阻止等待子级终止-之所以不会发生,是因为父级没有从队列中使用子级的数据。

解决方案是在父级使用完队列中的所有数据加入子级进程其中包括尚未入队的数据。所以随便走

for work in workers: work.join()

到文件末尾,它将起作用。

这不是完美的,因为您需要确保从子级中删除所有来自子级的数据。但幸运的是,您的情况还可以,因为Queue.put()每个孩子都有一个如果有多个大的“ put”,则父进程将不会收集第二个及后续的“ puts”,并且将发生死锁条件。

《多处理编程指南》中的“使用队列的联接过程”一节中的示例对此进行了说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章