Python 3.x Python:杀死池中的所有进程
我有一个创建多个对象的函数Python 3.x Python:杀死池中的所有进程,python-3.x,multiprocessing,application-pool,daemons,Python 3.x,Multiprocessing,Application Pool,Daemons,我有一个创建多个对象的函数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):
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()
后,进程不会被终止,尽管我调用了close和join。我做错了什么
如果我从终端终止程序,我会得到以下错误:
->File "threading.py", line 1070, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt:
编辑
为了补充更多信息,当我启动程序时,它最初运行得很快,但随着时间的推移,速度会减慢。随着程序速度的减慢,RAM消耗量增加,超过我的RAM并填满交换空间。如果没有多处理,您根本不会注意到任何RAM消耗,因为程序非常小<代码>htop只显示1到4个进程同时运行。试试看
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()
您不需要关闭()池,因为它是自动调用的
编辑超时我尝试了您的代码,但这导致了相同的问题
htop
向我显示了满是python执行的页面。我尝试了您的编辑,但在收到结果之前无法终止该过程。我如何在进程完成计算后终止它?只需删除get()和call pool.terminate()中的可选超时(不在except块中)。但是我建议现在我的电脑不再冻结了。但是,调用foo()
的频率越高,计算速度就越慢。是否异步调用foo()?