我一周前提交了一个关于终止 ProcessPoolExecutor 后持久进程的问题,但还没有回复。我认为这可能是因为没有足够多的人熟悉 ProcessPoolExecutor 的编码方式,所以我认为向使用多处理模块的人提出一个更一般的问题会有所帮助。
在Python文档中,它指出
在 POSIX 上,使用spawn或forkserver启动方法还将启动一个资源跟踪器进程,该进程跟踪由程序进程创建的未链接的命名系统资源(例如命名信号量或SharedMemory对象)。当所有进程退出后,资源跟踪器将取消任何剩余跟踪对象的链接。
但是,文档中没有说明如何在不再需要时关闭此资源跟踪器。据我所知,跟踪器 PID 不可用于 ProcessPoolExecutor,但我确实在某处读到可以使用 Pool 来访问它。在我重构代码之前,有人可以确认这是否属实吗?
您可以使用内部方法
_stop
来实现此目的,但是......由于使用内部和/或未记录的功能时涉及潜在风险,因此应谨慎执行:
下面是演示上述内容的代码示例:
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import resource_tracker
def example_function(x):
return x * x
if __name__ == '__main__':
with ProcessPoolExecutor() as executor:
results = list(executor.map(example_function, range(10)))
# Manually stop the resource tracker
resource_tracker._resource_tracker._stop()
print("Resource tracker stopped.")
该代码在我的 Linux Mint 21.2 Xfce 机器上退出,退出代码为 0,因此我认为它执行了预期的操作。