我正在使用Python的多處理器庫,想知道我可以調用的最大工作進程是多少?Python多處理:最大。池工作進程的數量?
E.g.我已經定義了async.pool = Pool(100)
,這將允許我同時運行最多100個異步進程,但是我不知道這個實際最大值是多少?
有誰知道如何找到我的池的最大值?我猜這取決於CPU或內存。
我正在使用Python的多處理器庫,想知道我可以調用的最大工作進程是多少?Python多處理:最大。池工作進程的數量?
E.g.我已經定義了async.pool = Pool(100)
,這將允許我同時運行最多100個異步進程,但是我不知道這個實際最大值是多少?
有誰知道如何找到我的池的最大值?我猜這取決於CPU或內存。
這不是一個完整的答案,但來源可以幫助指導我們。當你通過maxtasksperchild
到Pool
它保存這個值作爲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()
,你有記憶,您可以使用盡可能多的工人。 話雖這麼說,如果你設置了游泳池,沒有任何process
標誌,你會得到工人等於機器的CPU:
從Pool
文檔:
流程是使用工作進程的數量。如果進程爲None,則使用由os.cpu_count()返回的數字。
如果你在做CPU密集型工作,我不希望池中的工作人員比你的CPU數量多。更多的工作人員會迫使操作系統上下文切換你的進程,這反過來會降低系統性能。即使訴諸使用超線程核心,也可能會根據您的工作阻塞處理器。另一方面,如果你的任務像一個擁有許多併發請求的web服務器,而這些併發請求並沒有使你的處理器達到最大化,那就繼續產生儘可能多的內存和IO容量的工作者。
maxtasksperchild
是不同的。該標誌強制池釋放工人積累的所有資源,一旦該工人被使用/重複使用了特定次數。
如果您想象您的工作人員從磁盤讀取數據,並且此工作有一些設置開銷,maxtasksperchild
會在工作人員完成這麼多任務後清除開銷。
這幾乎取決於你的算法和你的機器。唯一知道的方法是基準。 –