2017-03-01 30 views
0

藉此範例程序:與ProcessPpplExecutor相比,爲什麼Python ThreadPoolExecutor.map花了這麼長時間纔開始產生結果?

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor 

def fun(xx): 
    for _ in range(10): 
     y = 1 
     x = xx 
     while x > 0: 
      y = (y * x) % 1000000007 
      x -= 1 
    print("END {}! = {}".format(xx, y)) 
    return xx, y 

with ThreadPoolExecutor(max_workers=8) as executor: 
    out = executor.map(fun, range(10000)) 
    for x in out: 
     print(x) 

這讓我看到的功能實際上是計算出的各時間打印的消息,並且還從當在輸出生成器被讀出的輸出。人們應該期望函數消息不是嚴格按順序排列的,而發生器是。另外,我希望發生器能夠爲我提供「作爲管線」的數據,在處理整個輸入之前給我提供中間結果。這可能是我正在處理的無限流。

如果我使用ProcessPoolExecutor,它的工作方式與我的預期相同,我很快就可以在線程池創建新結果的同時開始從輸出生成器讀取數據。另一方面,ThreadPoolExecutor雖然看起來效果不錯,但它只是在很多功能執行已經發生之後纔開始爲我提供輸出。例如:

END 6363! = 280520285 
END 6364! = 231081245 
END 6365! = 832114135 
END 6366! = 238546331 
(0, 1) 
(1, 1) 
(2, 2) 
(3, 6) 
(4, 24) 
END 6368! = 281286418 
END 6369! = 513183705 
END 6370! = 980177974 

爲什麼會有這麼大的差異,我該如何控制這種行爲?如果我想使用線程,並且我想確保我的結果更快,那麼我應該只是自己將數據分塊,而不是依賴於map

回答

0

你在ProcessPoolExecutor中得到更快結果的一個原因是它使得迭代器塊成爲可能,因此每個塊都是cpu的核心(你分配的worker的數量),並且該核心可以更快地完成塊的計算,進一步並執行你的for循環

相關問題