我需要运行一个可能需要数小时才能从Django视图完成的过程.我不需要知道状态或与之通信,但我需要该视图在启动过程后立即重定向.
我已经尝试使用subprocess.Popen内一个新的使用它threading.Thread,multiprocessing.Process.但是,父进程一直挂起,直到子进程终止.几乎完成它的唯一方法是使用fork.显然这并不好,因为它会留下一个僵尸进程,直到父终止.
这就是我在使用fork时要做的事情:
if os.fork() == 0:
subprocess.Popen(["/usr/bin/python", script_path, "-v"])
else:
return HttpResponseRedirect(reverse('view_to_redirect'))
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法从Django视图运行完全独立的进程,伤亡最小?或者我做错了什么?
经过多年的桌面应用程序开发后,我正在构建我的第一个Web应用程序(我正在使用Django/Python,但这可能是一个完全通用的问题,我不确定).所以请注意 - 这可能是一个超新手的问题......
我的一个用户进程涉及服务器中的繁重处理(即用户输入内容,服务器需要约10分钟来处理它).在桌面应用程序上,我会做的是将用户输入放入受互斥锁保护的队列中,并使用该互斥锁在队列中以低优先级阻塞运行专用后台线程.
然而,在Web应用程序中,一切似乎都面向与HTTP请求的同步.
假设我将数据库用作队列,运行后台进程的最佳实践架构是什么?
我继承了一个django + fastcgi应用程序,需要对其进行修改以执行冗长的计算(最多半小时或更长时间).我想要做的是在后台运行计算并返回"你的工作已经开始" - 类型的响应.当进程正在运行时,对URL的进一步命中应返回"您的作业仍在运行",直到作业完成,此时应返回作业的结果.对url的任何后续命中都应该返回缓存的结果.
我是django的一个新手,并且在十年内没有做过任何重要的网络工作,所以我不知道是否有内置的方法来做我想要的.我已经尝试通过subprocess.Popen()启动该过程,并且它工作正常,除了它在进程表中留下一个已解除的条目.我需要一个干净的解决方案,一旦完成就可以删除临时文件和进程的任何痕迹.
我也尝试过fork()和线程,但还没有找到可行的解决方案.对于我来说似乎是一个非常常见的用例,是否有规范的解决方案?FWIW这只会在流量非常低的内部服务器上使用.