[英]multiprocessing.Pool not using all the cores in M1 Mac
這是我的代碼:
from multiprocessing.dummy import Pool
def process_board(elems):
# do something
for _ in range(1000):
with Pool(cpu_count()) as p:
_ = p.map(process_board, enumerate(some_array))
我可以確保len(some_array) > 1000
,所以肯定有更多的工作可以分發,但似乎並非如此……我錯過了什么?
更新:
我嘗試將它們分塊,看看是否有任何區別:
# elements per chunk -> time taken
# 100 -> 31.9 sec
# 50 -> 31.8 sec
# 20 -> 31.6 sec
# 10 -> 32 sec
# 5 -> 32 sec
考慮到我有大約 1000 個元素,所以每個塊 100 個元素意味着 10 個塊,這是我在測試期間的 CPU 負載:
如您所見,更改塊數無助於使用最后 4 個 CPUS...
您使用的是multiprocessing.dummy.Pool
,它是一個看起來像多處理池的線程池。 這對釋放 GIL 的 I/O 任務很有用,但對 CPU 綁定任務沒有優勢。 需要注意的是,python 全局解釋器鎖 (GIL) 確保一次只有一個線程可以執行字節碼。
多處理是否加快速度取決於將數據發送到工作子進程和從工作子進程發送數據的成本與對數據完成的工作量的關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.