如何从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视图运行一个完全独立的进程?或者我做错了什么?

+2

重复: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

我不知道这是否适合您的情况,但这里是我做的:我使用任务队列(通过django模型);当视图被调用时,它会在任务中输入新记录并愉快地重定向。反过来,cron定期执行任务,独立于django。

编辑:cron调用相关(和自定义)django命令来执行任务。

http://code.google.com/p/django-command-extensions/wiki/JobsScheduling

是一个很好的库,你可以用它来完成这个任务。

首先 - 尽量为你使用cron任务,早说shanyu。

如果它不适合你 - 那么尝试使用CeleryProject,用于Django任务队列。为了工作,它使用RabbitMQ。这里有一点overview简单的使用基期货

看看kronos.py中的代码来查看这个问题的一个解决方案。所有这些的

http://www.razorvine.net/download/kronos.py