你能在 Python 的多处理池中让 Pool 在多个不同的 Map 函数中保持打开状态吗?



我想知道您是否可以在多个不同的map功能中留下multiprocessing.Pool开放?如果这是可能的,这种方法有什么缺陷吗?

我的一般用例是将一个池分配给一个类变量,例如self.pool,然后在类中的各种不同的map函数(例如self.pool.map(func, args))中调用该self.pool。我的目标是尽量减少关闭然后重新启动每个工作人员的pool的开销,这样我就可以无限期地保持它们打开并在需要时将self.pool.map工作传递给它们。

我可以看到的一个潜在的陷阱是,一旦我使用完类,我需要记住关闭类中的self.pool

是的,您可以多次使用该池。你的设计很好。当然,您必须关闭,但是封闭类本身可以有一个def close(self):函数来完成此操作,并使此成为使用该类的要求。如果愿意,你甚至可以让那个类成为一个上下文管理器。在finally块中捕获异常和关闭东西是python编程的标准要求。

作为一个例子,

import multiprocessing as mp
import threading
class MyClassWithPool:
def __init__(self, workers=None):
self._mp_pool_lock = threading.Lock()
self._pool = None
if workers is None:
self._pool_count = min(2, int(mp.cpu_count() * .50))
else:
self._pool_count = workers
# initialize your other stuff...
@property
def mp_pool(self):
with self._mp_pool_lock:
if self._pool is None:
self._pool = mp.Pool(self._pool_count)
return self._pool
def close(self):
with self._mp_pool_lock:
if self._pool:
self._pool.close()
self._pool = None
# ... any other cleanup ...
def __del__(self):
self.close()

def do_some_stuff(i):
return i

def do_other_stuff(i):
return i
def main():
my_data = MyClassWithPool()
try:
result_1 = my_data.mp_pool.map(do_some_stuff, range(5))
print(result_1)
result_2 = my_data.mp_pool.map(do_other_stuff, range(99))
print(result_2)
finally:
my_data.close()
if __name__ == "__main__":
main()

最新更新