我有一个可执行文件,我需要经常使用不同的参数运行它。为此,我使用 multiprocessing 模块编写了一个小型 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
输出中看到二进制程序的两个实例正在运行(通常是第 1 天和第 3 天)。现在,当我按下 时^C
,包装脚本退出,第 1 天和第 3 天的二进制程序消失了,但是第 5 天和第 7 天运行了新的二进制程序。
所以对我来说,似乎在最终死亡之前Pool
启动了另一个进程。numproc
任何想法这里发生了什么,我能做些什么?