2014-02-25 99 views
2

我正在使用Python的多處理器庫,想知道我可以調用的最大工作進程是多少?Python多處理:最大。池工作進程的數量?

E.g.我已經定義了async.pool = Pool(100),這將允許我同時運行最多100個異步進程,但是我不知道這個實際最大值是多少?

有誰知道如何找到我的池的最大值?我猜這取決於CPU或內存。

+1

這幾乎取決於你的算法和你的機器。唯一知道的方法是基準。 –

回答

2

這不是一個完整的答案,但來源可以幫助指導我們。當你通過maxtasksperchildPool它保存這個值作爲self._maxtasksperchild和只使用它創建一個worker對象:

def _repopulate_pool(self): 
    """Bring the number of pool processes up to the specified number, 
    for use after reaping workers which have exited. 
    """ 
    for i in range(self._processes - len(self._pool)): 
     w = self.Process(target=worker, 
         args=(self._inqueue, self._outqueue, 
           self._initializer, 
           self._initargs, self._maxtasksperchild) 
         ) 

     ... 

這個工人對象使用maxtasksperchild像這樣:

assert maxtasks is None or (type(maxtasks) == int and maxtasks > 0) 

這將不更改物理限制,並且

while maxtasks is None or (maxtasks and completed < maxtasks): 
    try: 
     task = get() 
    except (EOFError, IOError): 
     debug('worker got EOFError or IOError -- exiting') 
     break 
    ... 
    put((job, i, result)) 
    completed += 1 

本質上保存每個任務的結果。雖然你可能通過保存太多的結果來解決內存問題,但是通過首先將列表過大可以實現同樣的錯誤。簡而言之,只要結果一旦釋放,結果就可以放入記憶中,資料來源並不建議限制可能的任務數量。

這是回答這個問題嗎?不是完全。但是,在Ubuntu 12.04上使用Python 2.7.5,這個代碼而不適合的對於任何大的max_task值似乎都運行得很好。被警告,輸出似乎需要更長的成倍爲大型值運行:

import multiprocessing, time 
max_tasks = 10**3 

def f(x): 
    print x**2 
    time.sleep(5) 
    return x**2 

P = multiprocessing.Pool(max_tasks) 
for x in xrange(max_tasks): 
    P.apply_async(f,args=(x,)) 
P.close() 
P.join() 
+0

我可以考慮操作系統施加的大量限制(每個用戶最大進程數/線程數,最大進程數/整個thred,每個用戶最大內存,每個進程打開文件描述符的最大數量,最大打開總數文件描述符等)和至少一個平臺限制(最大物理內存) – isedev

+0

@isedev我同意,這就是爲什麼我添加了一個快速檢查,看看我是否可以崩潰我的系統(我不能,雖然我有興趣知道你是否可以)。我查看了源代碼,看看代碼中是否有硬編碼的值(這看起來沒有)。 – Hooked

+0

你寫關於'maxtasksperchild'的問題是關於'進程'參數到'Pool'的問題。 –

0

,你有記憶,您可以使用盡可能多的工人。 話雖這麼說,如果你設置了游泳池,沒有任何process標誌,你會得到工人等於機器的CPU:

Pool文檔:

流程是使用工作進程的數量。如果進程爲None,則使用由os.cpu_count()返回的數字。

如果你在做CPU密集型工作,我不希望池中的工作人員比你的CPU數量多。更多的工作人員會迫使操作系統上下文切換你的進程,這反過來會降低系統性能。即使訴諸使用超線程核心,也可能會根據您的工作阻塞處理器。另一方面,如果你的任務像一個擁有許多併發請求的web服務器,而這些併發請求並沒有使你的處理器達到最大化,那就繼續產生儘可能多的內存和IO容量的工作者。

maxtasksperchild是不同的。該標誌強制池釋放工人積累的所有資源,一旦該工人被使用/重複使用了特定次數。

如果您想象您的工作人員從磁盤讀取數據,並且此工作有一些設置開銷,maxtasksperchild會在工作人員完成這麼多任務後清除開銷。