2017-03-05 37 views
1

我想并行我的一个长时间运行的任务。出于某种原因,它不会完成并永远悬挂。Python多进程 - 为什么我的进程没有返回/结束?

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

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

如果我减少for循环的范围,让我们说range(0,50),它突然起作用。

这里有什么问题?

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

+0

无法重现。发布的代码为我工作。 – tdelaney

+0

噢!真奇怪。我将代码复制到一个新文件中,并且仍然存在相同的问题。我重新启动了我的电脑两次。你运行的是哪个版本的Python?我在窗口上的Python 3.4上 – user66875

+0

我是在Linux mint 17.3上的python 3.4。 – tdelaney

回答

1

您在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() 
相关问题