Python多处理:在退出

时间:2016-04-15 22:14:17

标签: python multiprocessing

我编写了一个简单的函数来运行具有依赖关系跟踪的作业。确切的代码并不重要,但我这样做的方法是创建一个我用multiprocessing.Process分叉的作业监控功能,我通过两个多处理Queue发送和从中获取作业对象。

它工作得很好,但因为我使用无限循环,当父进程在退出时挂起,因为python仍然在等待子进程。有没有一种方法可以在退出时立即杀死子进程?也许通过捕捉信号?

我的实际代码在这里: https://gist.github.com/MikeDacre/e672969aff980ee950b9dfa8b2552d40 这里有一个更完整的例子: http://nbviewer.jupyter.org/github/MikeDacre/python-cluster/blob/cluster/tests/local_queue.ipynb

虽然玩具示例可能更好:

import multiprocessing as mp
from time import sleep
def runner():
    while True:
        sleep(2)

runner = mp.Process(target=runner)
runner.start()
exit()

在输入Ctrl-C之前,这将很愉快。

我认为信号捕捉无效,因为正常退出时没有信号发送。有没有办法抓住exit()?如果没有,是否有任何方法以自然终止的方式创建流程?

1 个答案:

答案 0 :(得分:2)

感谢大家,在写完这个问题后不久,我发现了使用python' atexit模块的解决方案:

import atexit
import multiprocessing as mp
from time import sleep
def runner():
    while True:
        sleep(2)

def kill_runner(runner):
    runner.terminate()

runner = mp.Process(target=runner)
runner.start()
atexit.register(kill_runner, runner)
exit()

按预期工作。