如何从Django视图启动长时间运行的进程?

时间:2009-10-24 22:42:12

标签: python django long-running-processes

我需要运行一个可能需要数小时才能从Django视图完成的过程。我不需要知道状态或与之通信,但我需要该视图在启动过程后立即重定向。

我尝试使用subprocess.Popen,在新的threading.Threadmultiprocessing.Process中使用它。但是,父进程一直挂起,直到子进程终止。 几乎完成任务的唯一方法是使用fork。显然这并不好,因为它会让父母终止僵尸进程。

这就是我在使用fork时要做的事情:

if os.fork() == 0:
    subprocess.Popen(["/usr/bin/python", script_path, "-v"])
else:
    return HttpResponseRedirect(reverse('view_to_redirect'))

那么,有没有办法从Django视图运行一个完全独立的进程,伤亡最小?或者我做错了什么?

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:5)

首先 - 尝试使用cron为你完成任务,如早期说shanyu。

如果它不适合你 - 那么尝试使用CeleryProject,用于Django的任务队列。对于工作,它使用RabbitMQ。对于简单使用基础期货

,这里有一点overview

答案 2 :(得分:2)

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

是一个很好的库,可用于完成此任务。

答案 3 :(得分:2)

看看kronos.py中的代码,看看这个问题的一个解决方案。

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