我有一个创建多个对象的函数foo()
。在我的程序运行期间多次调用此函数。为了加速我的代码,我想让foo()
创建一组进程,并行计算新对象。
def foo(self):
pool = multiprocessing.Pool()
self.nodes = pool.map(self._create_node, self.args)
pool.close()
pool.join()
def _create_node(self, args):
n = Node(args)
return n
这在理论上是有效的,但在几次调用foo()
我的电脑冻结之后。我认为在foo()
打电话后,这些过程不会被杀死,尽管我打电话给他并加入。我做错了什么?
如果我从终端终止程序,我收到此错误:
->File "threading.py", line 1070, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt:
要添加更多信息,当我启动程序时,它最初会快速运行,但会随着时间的推移而减慢速度。随着程序变慢,RAM消耗增加,超过我的RAM并填充交换。如果没有多处理,您根本不会注意到任何RAM消耗,因为程序非常小。 htop
仅显示1个最多4个进程同时运行。
答案 0 :(得分:0)
尝试
def foo(self):
with multiprocessing.Pool() as pool:
result = pool.map_async(self._create_node, self.args)
try:
self.nodes = result.get(300) #get the result or throws a timeout exception after 300 seconds
except:
pool.terminate()
您不需要在自动调用池时关闭()
编辑超时