我想知道您是否可以在多个不同的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()