3 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
抱歉,我應(yīng)該已經(jīng)回答您其他問(wèn)題了。您不能將普通multiprocessing.Lock對(duì)象傳遞給Pool方法,因?yàn)樗鼈儾荒鼙浑缰?。有兩種方法可以解決此問(wèn)題。一種是創(chuàng)建Manager()并傳遞一個(gè)Manager.Lock():
def main():
iterable = [1, 2, 3, 4, 5]
pool = multiprocessing.Pool()
m = multiprocessing.Manager()
l = m.Lock()
func = partial(target, l)
pool.map(func, iterable)
pool.close()
pool.join()
不過(guò),這有點(diǎn)重量級(jí);使用Manager需要產(chǎn)生另一個(gè)進(jìn)程來(lái)托管Manager服務(wù)器。并且所有對(duì)acquire/ release鎖的調(diào)用都必須通過(guò)IPC發(fā)送到該服務(wù)器。
另一個(gè)選擇是multiprocessing.Lock()使用initializerkwarg 在創(chuàng)建池時(shí)傳遞常規(guī)值。這將使您的鎖實(shí)例在所有子工作者中都是全局的:
def target(iterable_item):
for item in items:
# Do cool stuff
if (... some condition here ...):
lock.acquire()
# Write to stdout or logfile, etc.
lock.release()
def init(l):
global lock
lock = l
def main():
iterable = [1, 2, 3, 4, 5]
l = multiprocessing.Lock()
pool = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(target, iterable)
pool.close()
pool.join()
第二種解決方案具有不再需要的副作用partial。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
multiprocessing.Lock
是一個(gè)進(jìn)程安全的對(duì)象,因此您可以將其直接傳遞給子進(jìn)程,并在所有子進(jìn)程中安全地使用它。但是,大多數(shù)可變的Python對(duì)象(例如list
,,dict
大多數(shù)用戶創(chuàng)建的類)都不安全,因此在進(jìn)程之間傳遞它們會(huì)導(dǎo)致在每個(gè)進(jìn)程中創(chuàng)建對(duì)象的完全不同的副本。在這種情況下,您需要使用multiprocessing.Manager
。
添加回答
舉報(bào)