Python多重处理-为什么我的流程没有返回/结束?

use*_*875 5 python python-3.x

我正在尝试并行执行一项长期运行的任务。由于某种原因,它不会完成并且永远悬挂。

import multiprocessing as mp

class PartitionedResult(object):
    index = 0
    P = []
    def __init__(self, index, P):
        self.index = index
        self.P = P        


def longRunningTask(index, output):
    P = []
    for i in range (0, 1000):        
        print(i)
        P.append(i)

    print("I'm done!")
    output.put(PartitionedResult(index, P))
    return

def main():
    output = mp.Queue()
    processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)]
    for p in processes:
        p.start()

    for p in processes:
        p.join()

    results = [output.get() for p in processes]
    print("This never shows up")



if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

它为4个过程中的每一个都打印数字0-999,甚至达到“我完成了!”的水平。线,但它不会到达results = [output.get() for p in processes]线

如果我将for循环范围缩小,比如说range(0,50),它会突然起作用。

这是什么问题

编辑:我在Windows 10上使用Python 3.4,我在2台不同的计算机上尝试过,并删除了pycache。

mat*_*ata 5

您正在调用join()所有过程,然后再get()得出结果。当队列的缓冲区填满时,它可以在将数据刷新到基础管道时阻塞。如果join()某个进程以这种方式阻止了使用者进程,则将导致死锁,因为该进程只能在写入所有数据后退出。

将通话移至您的通话末尾,main()然后它应该可以正常工作:

def main():
    output = mp.Queue()
    processes = [mp.Process(target=longRunningTask, args=(x,output,)) for x in range(4)]

    for p in processes:
        p.start()  

    results = [output.get() for p in processes]
    print("This never shows up")

    for p in processes:
        p.join()
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,你的解决方案挂起......;/ (2认同)