3

我有一个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 并加入。我究竟做错了什么?

如果我从终端终止程序,我会收到此错误:

->File "threading.py", line 1070, in _wait_for_tstate_lock
    elif lock.acquire(block, timeout):

KeyboardInterrupt: 

编辑

要添加更多信息,当我启动程序时,它最初运行得很快,但随着时间的推移会变慢。随着程序变慢,RAM 消耗量增加,超过了我的 RAM 并填满了 Swap。如果没有多处理,您根本不会注意到任何 RAM 消耗,因为程序非常小。htop仅显示 1 到 4 个进程同时运行。

4

1 回答 1

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

您不需要 close() 池,因为它是自动调用的

编辑超时

于 2016-06-30T13:43:12.150 回答