python - python中的多处理被阻止

标签 python queue multiprocessing

我在我的项目中使用多处理。我有一个工作函数,它将结果放入队列中。一切正常。但是随着 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

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

最佳答案

您很可能会产生死锁。

来自programming guidelines :

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

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

关于python - python中的多处理被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649625/

相关文章:

multithreading - 使用 openMP 进行多核处理与多线程

python - "WindowsError: Access is denied"调用 Process.terminate

python - 查找并替换列表宽度 Python 中的空行

python - Pygame 将 28x28 像素缩放到 420x420

c# - 如何在 C# 中使用 for 循环从队列中检索值?

queue - MSMQ 如何管理消息?

python - 从 PySpark 中的类别分布中查找值的百分位数

python - 读取后使用不同的行作为 pandas 中的标签

ios - "Throttle"使用 Grand Central Dispatch 的指令队列

python - 从 FTP 下载文件时出现多处理错误