さまざまなパラメータを使用して、頻繁に実行する必要のある実行可能ファイルがあります。このために、ここに示すパターンに従って、マルチプロセッシングモジュールを使用して小さなPython(2.7)ラッパーを作成しました。
私のコードは次のようになります。
try:
logging.info("starting pool runs")
pool.map(run_nlin, params)
pool.close()
except KeyboardInterrupt:
logging.info("^C pressed")
pool.terminate()
except Exception, e:
logging.info("exception caught: ", e)
pool.terminate()
finally:
time.sleep(5)
pool.join()
logging.info("done")
私のワーカー関数はここにあります:
class KeyboardInterruptError(Exception): pass
def run_nlin((path_config, path_log, path_nlin, update_method)):
try:
with open(path_log, "w") as log_:
cmdline = [path_nlin, path_config]
if update_method:
cmdline += [update_method, ]
sp.call(cmdline, stdout=log_, stderr=log_)
except KeyboardInterrupt:
time.sleep(5)
raise KeyboardInterruptError()
except:
raise
path_config
バイナリプログラムの設定ファイルへのパスです。たとえば、プログラムを実行する日付があります。
ラッパーを起動すると、すべてが正常に見えます。ただし、を押すと、ラッパースクリプトは、終了する前にプールから^C
追加のプロセスを起動するようです。numproc
例として、1〜10日目にスクリプトを開始すると、ps aux
出力でバイナリプログラムの2つのインスタンスが実行されていることがわかります(通常は1日目と3日目)。ここで、を押す^C
と、ラッパースクリプトが終了し、1日目と3日目のバイナリプログラムはなくなりますが、5日目と7日目に実行されている新しいバイナリプログラムがあります。
だから私には、最終的に死ぬ前にPool
別のプロセスを起動するように見えます。numproc
ここで何が起こっているのか、そして私がそれについて何ができるのか、何かアイデアはありますか?