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