8

Pythonから何度も呼び出しているモデルがあります。モデルの起動とシャットダウンには長い時間がかかりますが、入力データの処理には短時間しかかかりません(起動/シャットダウンの間に複数回実行できます)。マルチプロセッシングPool()はこれを行うための良い方法のように見えましたが、Model()クラスを正しく破棄するのに問題があります。

プログラムコードの簡略化した構造を以下に示します。実際には、init関数とdel関数はwin32com.clientモジュールでいくつかの巧妙なことを行う必要があり、model.y変数は外部アプリケーションを制御するためのハンドルです。

#!/usr/bin/env python

import multiprocessing
import random
import time

class Model():
    def __init__(self):
        self.y = random.randint(0,5) # simplification
        time.sleep(5) # initialisation takes a while...
    def __del__(self):
        del(self.y) # simplification
        time.sleep(1) # destruction isn't especially quick either

def init():
    global model
    model = Model()

def f(x): # worker function, runs quickly
    return model.y * x ** 2

def main():
    pool = multiprocessing.Pool(processes=2, initializer=init)
    it = pool.imap(f, range(4))
    for n in range(4):
        print it.next()
    pool.close()

if __name__ == '__main__':
    main()

ガベージコレクターに参照が保持されているため、Model()に対してdel関数が呼び出されることはありません。プログラムの最後にモデルが正しく閉じられていることを確認するにはどうすればよいですか?

4

2 に答える 2

2

johnthexiiiのソリューションは、ワーカー関数の最初の実行時にモデルを強制終了します。別の破棄機能を提供できます。

import time

def g(x): # destroy function
    del model
    time.sleep(1) # to ensure, this worker does not pick too many
    return None

pool.close()追加する前に

pool.map_async(g, range(2), 1) # if specified to have two processes before

これは非常に「クリーンな」ソリューションだとは思いませんが、機能するはずです。

于 2012-10-30T09:33:46.657 に答える
0

どうですか

def f(x): # worker function, runs quickly
    y = model.y
    del model
    return y * x ** 2
于 2012-10-29T21:39:40.153 に答える