gpt4 book ai didi

python - 为什么 Python Multiprocessing Workers 不会死?

转载 作者:太空狗 更新时间:2023-10-29 19:26:39 35 4
gpt4 key购买 nike

我正在使用 python 多处理功能将某些功能映射到某些元素。类似这样的事情:

def computeStuff(arguments, globalData, concurrent=True):
pool = multiprocessing.Pool(initializer=initWorker, initargs=(globalData,))
results = pool.map(workerFunction, list(enumerate(arguments)))
return results

def initWorker(globalData):
workerFunction.globalData = globalData

def workerFunction((index, argument)):
... # computation here

通常我在 ipython 中使用 cPython 和 Pypy 运行测试。我注意到生成的进程通常不会被杀死,所以它们开始累积,每个进程都使用一个 ram。在计算过程中按 ctrl-k 时会发生这种情况,这会使多处理陷入困惑的狂潮。但即使让计算完成,这些进程也不会在 Pypy 中消亡。

根据文档,当池被垃圾回收时,它应该调用 terminate() 并终止所有进程。这里发生了什么事?我必须显式调用 close() 吗?如果是,是否有某种上下文管理器可以正确管理关闭资源(即进程)?

这是在 Mac OS X Yosemite 上。

最佳答案

PyPy 的垃圾收集是惰性的,因此未能调用 close 意味着 Pool “有时”被清理,但这可能并不意味着“很快”。

一旦 Pool 被正确地closed,worker 在用完任务时退出。确保 Pool 在 3.3 之前的 Python 中关闭的简单方法是:

from contextlib import closing

def computeStuff(arguments, globalData, concurrent=True):
with closing(multiprocessing.Pool(initializer=initWorker, initargs=(globalData,))) as pool:
return pool.map(workerFunction, enumerate(arguments))

注意:我还删除了对 list 的显式转换(毫无意义,因为 map 将为您迭代 enumerate 迭代器),然后返回直接返回结果(无需分配名称,仅在下一行返回)。

如果你想确保在异常情况下立即终止(在 3.3 之前的 Python 上),你可以使用 try/finally block ,或者编写一个简单的上下文管理器(它可以在你使用):

from contextlib import contextmanager

@contextmanager
def terminating(obj):
try:
yield obj
finally:
obj.terminate()

def computeStuff(arguments, globalData, concurrent=True):
with terminating(multiprocessing.Pool(initializer=initWorker, initargs=(globalData,))) as pool:
return pool.map(workerFunction, enumerate(arguments))

terminating 方法的优越之处在于它保证进程立即退出;从理论上讲,如果您在主程序的其他地方使用线程,Pool worker 可能会与非守护线程 fork ,即使在 worker 任务线程退出时,这也会使进程保持事件状态; terminating 通过强行终止进程来隐藏这一点。

如果您的解释器是 Python 3.3 或更高版本,terminating 方法内置于 Pool,因此 with 不需要特殊包装器code> 语句,with multiprocessing.Pool(initializer=initWorker, initargs=(globalData,)) as pool: 直接工作。

关于python - 为什么 Python Multiprocessing Workers 不会死?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661177/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com