2017-04-23 42 views
2

我是新來的Python的多,而且我寫了下面的小腳本:問題與池和多模塊的隊列在Python

import multiprocessing 
import os 

def task(queue): 
    print(100) 

def run(pool): 
    queue = multiprocessing.Queue() 
    for i in range(os.cpu_count()): 
     pool.apply_async(task, args=(queue,)) 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    pool = multiprocessing.Pool() 
    run(pool) 
    pool.close() 
    pool.join() 

我很奇怪,爲什麼不執行,有任務()方法運行此腳本後沒有輸出。任何人都可以幫我嗎?

回答

2

它正在運行,但它正在死於主線程之外的錯誤,所以您看不到錯誤。因此,即使您不關心結果,異步調用的結果.get()總是好的:.get()將引發不可見的錯誤。

例如,改變你的循環,像這樣:

tasks = [] 
for i in range(os.cpu_count()): 
    tasks.append(pool.apply_async(task, args=(queue,))) 
for t in tasks: 
    t.get() 

那麼新t.get()將炸燬,結尾:

RuntimeError: Queue objects should only be shared between processes through inheritance 

總之,通過Queue對象Pool方法是不支持的。

但是你可以通過將它們傳遞給multiprocessing.Process()或者Pool初始化函數。例如,這裏有一個辦法做到後者:

import multiprocessing 
import os 

def pool_init(q): 
    global queue # make queue global in workers 
    queue = q 

def task(): 
    # can use `queue` here if you like 
    print(100) 

def run(pool): 
    tasks = [] 
    for i in range(os.cpu_count()): 
     tasks.append(pool.apply_async(task)) 
    for t in tasks: 
     t.get() 

if __name__ == '__main__': 
    queue = multiprocessing.Queue() 
    pool = multiprocessing.Pool(initializer=pool_init, initargs=(queue,)) 
    run(pool) 
    pool.close() 
    pool.join() 

在Linux-Y系統,你可以 - 因爲原來的錯誤信息提示 - 使用過程中繼承,而不是(但是這是不可能在Windows上)。

+0

謝謝。這真的有幫助! –