[英]Python multiprocessing's Pool process limit
在使用來自多處理模塊的Pool對象時,進程數是否受CPU內核數的限制? 例如,如果我有4個核心,即使我創建具有8個進程的Pool,一次只能運行4個?
您可以根據需要請求多個進程。 可能存在的任何限制將由您的操作系統強加,而不是由multiprocessing
強加。 例如,
p = multiprocessing.Pool(1000000)
在任何機器上都可能遭受丑陋的死亡。 我在輸入時在盒子上嘗試,操作系統正在磨碎我的磁盤,以瘋狂地交換掉RAM-在它創建了大約3000個進程之后最終將其殺死;-)
至於“一次”將運行多少,Python對此沒有發言權。 這取決於:
對於與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很好。
希望這可以幫助 :)
那是正確的。 如果您有4個核心,則可以一次運行4個進程。 請記住,您需要繼續進行一些系統工作,將進程號定義為number_of_cores - 1
會很好。 這是首選項,不是強制性的。 對於您創建的每個進程都有開銷,因此實際上您在使用更多的內存來執行此操作。 但是如果RAM沒問題,那就去解決。 如果您正在運行Cuda或其他基於GPU的庫,那么您將擁有不同的范例,但這是另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.