【问题标题】:Multiprocessing in python blockedpython中的多处理被阻止
【发布时间】:2012-11-18 22:24:55
【问题描述】:

我在我的项目中使用多处理。我有一个工作函数,它将结果放入队列中。一切正常。但是随着 x 的大小增加(在我的情况下 x 是一个数组),出现了问题。这是我的代码的简化版本:

def do_work(queue, x):
    result = heavy_computation_function(x)
    queue.put(result)   # PROBLEM HERE

def parallel_something():
    queue = Queue()
    procs = [Process(target=do_work, args=i) for i in xrange(20)]
    for p in procs: p.start()
    for p in procs: p.join()

    results = []
    while not queue.empty():
        results.append(queue.get)

    return results

我在系统监视器中看到 python 进程正在工作,但随后发生了一些事情,所有进程都在运行但什么也没做。这是我输入 ctrl-D 时得到的。

    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt

我做了一些测试。实际上,问题似乎在于将结果放入队列中,如果我不将结果放入队列中一切正常,那么就没有任何目的了。

【问题讨论】:

  • 您似乎永远不会将队列对象传递给新进程。另外argsProcess 应该是tuple。尝试将其更改为args=(queue, i)。您的queue.get 还需要一些括号,以便它变为queue.get()

标签: python queue multiprocessing


【解决方案1】:

您很可能正在产生死锁。

来自programming guidelines

这意味着每当您使用队列时,您需要确保所有已放入队列的项目最终都会在进程加入之前被移除。否则,您无法确定将项目放入队列的进程将终止。还要记住,非守护进程将自动加入。

页面中还提出了一个可能的修复方案。请记住,如果进程没有加入,这并不意味着它们在任何意义上都“占用”了资源。这意味着您可以在进程完成操作后(可能使用locks)取出排队的数据,然后再加入进程。

【讨论】:

    【解决方案2】:

    嗯,看起来这是python的队列模块中的一些错误。事实上使用..

    from multiprocessing import Manager
    
    queue = Manager().Queue()
    

    ..一切正常,但我仍然不知道为什么..:)

    【讨论】:

    • 不同之处在于您正在实例化Manager().Queue() 而不是简单的Queue()。我认为这意味着Manager.__init__() 在第一种形式中被调用,但不是在第二种形式中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2015-05-11
    相关资源
    最近更新 更多