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関数が呼び出されることはありません。プログラムの最後にモデルが正しく閉じられていることを確認するにはどうすればよいですか?