我使用Django为多核科学计算库创建了一个基于浏览器的图形用户界面,使用gunicorn作为see服务器(也请参阅从Django视图启动多核背景进程)。我将图书馆的功能称为:
p = multiprocessing.Process(target=library_function, args=())
p.start()
print("test")库函数处理多核逻辑本身,所以我在这里还使用多处理模块的目的是使用户能够终止进程(通过p.terminate())。然而,这一做法目前不起作用。我的假设是,我还需要p.join()来终止library_function()调用的任何内容。问题是,当我在p.join()之后调用p.start()时,进程似乎不再异步运行,即在示例中,即"test“没有立即打印出来。但是,在我的用例中,异步是绝对必需的。
有没有人提示(1)在后台运行进程,(2)仍然允许用户终止进程?
更新
下面是noxdafox的评论,这是我现在的快速而肮脏的解决方案:
import psutil, signal, os, multiprocessing
# start process
p = multiprocessing.Process(target=library_function, args=())
p.start()
# stop process
for child in psutil.Process(p.pid).children(recursive=True):
child.kill() # kill child processes
os.kill(p.pid, signal.SIGKILL) # kill parent process
p.join() # kills parent zombie process发布于 2015-08-05 08:53:14
对于您的第一个问题,我建议异步任务处理芹菜将是更好的选择。
使用芹菜,您可以让用户撤销这些任务:
结果= add.apply_async(args=2,2,countdown=120) result.revoke()
通过撤销,芹菜工作不会执行任务。
https://stackoverflow.com/questions/31827503
复制相似问题