簡體   English   中英

multiprocessing.Pool 未使用 M1 Mac 中的所有內核

[英]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))

這是代碼運行時我的 mac 的活動監視器: 活動監視器

我可以確保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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM