簡體   English   中英

Python多處理的Pool進程限制

[英]Python multiprocessing's Pool process limit

在使用來自多處理模塊的Pool對象時,進程數是否受CPU內核數的限制? 例如,如果我有4個核心,即使我創建具有8個進程的Pool,一次只能運行4個?

您可以根據需要請求多個進程。 可能存在的任何限制將由您的操作系統強加,而不是由multiprocessing強加。 例如,

 p = multiprocessing.Pool(1000000)

在任何機器上都可能遭受丑陋的死亡。 我在輸入時在盒子上嘗試,操作系統正在磨碎我的磁盤,以瘋狂地交換掉RAM-在它創建了大約3000個進程之后最終將其殺死;-)

至於“一次”將運行多少,Python對此沒有發言權。 這取決於:

  1. 您的硬件能夠同時運行多少個; 和,
  2. 操作系統如何決定為當前正在運行的計算機上的所有進程提供硬件資源。

對於與CPU綁定的任務,創建比您具有運行它們的核心更多的Pool進程沒有任何意義 如果您也嘗試將計算機用於其他用途,則創建的進程應少於核心。

對於受I / O約束的任務,創建比內核更多的Pool進程可能是有意義的,因為這些進程可能會花費大部分時間來阻塞(等待I / O完成)。

是。 從理論上講,您可以創建的進程沒有限制,但是由於內存不足,一次啟動的大量進程會導致系統死亡。 請注意,進程占用的內存比線程大得多,因為它們不使用它們之間的共享空間,而是為每個進程使用單獨的空間。

因此,最佳的編程習慣是使用僅限於系統處理器數量的信號量。 可能的

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

如果您不知道系統的內核數,或者想在許多系統中使用該代碼,則可以使用如下所示的通用代碼...

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  

PS,但始終使用核心數1很好。

希望這可以幫助 :)

盡管沒有限制,但可以設置,但是如果您想了解用於CPU綁定進程的便捷數字(我懷疑您在這里正在尋找),則可以運行以下命令:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1

有關限制的一些好的說明(尤其是在Linux中)在此處的答案中進行了說明

那是正確的。 如果您有4個核心,則可以一次運行4個進程。 請記住,您需要繼續進行一些系統工作,將進程號定義為number_of_cores - 1會很好。 這是首選項,不是強制性的。 對於您創建的每個進程都有開銷,因此實際上您在使用更多的內存來執行此操作。 但是如果RAM沒問題,那就去解決。 如果您正在運行Cuda或其他基於GPU的庫,那么您將擁有不同的范例,但這是另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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