藉此範例程序:與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
?