如何从Django视图开始长时间运行的进程?
问题描述:
我需要运行一个可能需要几个小时才能从Django视图完成的进程。我不需要知道状态或与之通信,但是我需要这个视图在启动过程后立即重定向。如何从Django视图开始长时间运行的进程?
我试过使用subprocess.Popen
,在新的threading.Thread
,multiprocessing.Process
内使用它。但是,父进程会一直挂起,直到孩子终止。 差不多完成的唯一方法是使用分叉。很明显,这并不好,因为它会在父母终止之前留下僵尸程序。
这就是我试图用叉子时要做到:
if os.fork() == 0:
subprocess.Popen(["/usr/bin/python", script_path, "-v"])
else:
return HttpResponseRedirect(reverse('view_to_redirect'))
那么,有没有一种方法,以最小的伤亡Django视图运行一个完全独立的进程?或者我做错了什么?
答
我不知道这是否适合您的情况,但这里是我做的:我使用任务队列(通过django模型);当视图被调用时,它会在任务中输入新记录并愉快地重定向。反过来,cron定期执行任务,独立于django。
编辑:cron调用相关(和自定义)django命令来执行任务。
答
首先 - 尽量为你使用cron任务,早说shanyu。
如果它不适合你 - 那么尝试使用CeleryProject,用于Django任务队列。为了工作,它使用RabbitMQ。这里有一点overview简单的使用基期货
重复:http://stackoverflow.com/search?q=%5Bpython%5D+long-running。 http://stackoverflow.com/questions/1107826/python-long-running-daemon-job-processor,http://stackoverflow.com/questions/805120/python-task-server – 2009-10-25 11:54:13