如何从多处理池的初始化程序中正确释放资源?

时间:2019-04-03 09:59:49

标签: python multiprocessing pool

我正在使用多处理池来并行化一些昂贵的计算。假设其中一些计算依赖于外部数据,例如硬盘驱动器上的文件,网络连接或运行其他编程语言的脚本的子进程。

我可以使用initializer中的multiprocessing.Pool初始化那些资源。但是,没有shutdown函数可以正确释放资源。

https://stackoverflow.com/a/28508998中举示例:

socket = None
def init(address, port):
    global socket
    socket = magic(address, port)

def job(data):
    global socket
    assert socket is not None
    return send(socket, data)

pool = multithreading.Pool(N, init, [address, port])
pool.map(job, ['foo', 'bar', 'baz'])

在此示例中,如何确保插座正确关闭?或者,从更一般的意义上讲,对每个工人执行一些结束代码?

此答案https://stackoverflow.com/a/13136120/2375130提出了以下解决方法(适用于本示例):

import time

def destroy(x):
    global socket
    socket.close()
    time.sleep(1) # to ensure that this worker does not run on two elements from range
    return None

pool.map_async(g, range(N), 1)

这似乎有点hack。有没有更好的选择而不涉及重新实现Pool?

0 个答案:

没有答案