2017-03-05 70 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() 
相關問題