Python:杀死池的所有进程

时间:2016-06-30 13:35:39

标签: 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):
        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个进程同时运行。

1 个答案:

答案 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()

您不需要在自动调用池时关闭()

编辑超时