我编写了一个简单的函数来运行具有依赖关系跟踪的作业。确切的代码并不重要,但我这样做的方法是创建一个我用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()
?如果没有,是否有任何方法以自然终止的方式创建流程?
答案 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()
按预期工作。