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 と join を呼び出しても、 を呼び出した後、プロセスは強制終了されないと思います。私は何を間違っていますか?

端末からプログラムを強制終了すると、次のエラーが発生します。

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

KeyboardInterrupt: 

編集

さらに情報を追加すると、プログラムを開始すると、最初は高速に実行されますが、時間の経過とともに遅くなります。プログラムの速度が低下すると、RAM の消費量が増加し、RAM を超えてスワップがいっぱいになります。マルチプロセッシングがなければ、プログラムが非常に小さいため、RAM の消費にまったく気付かないでしょう。htop同時に実行されている最大 4 つのプロセスを 1 つだけ表示します。

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 に答える