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

Python 如何从Django视图启动长时间运行的流程?,python,django,long-running-processes,Python,Django,Long Running Processes,我需要从Django视图运行一个可能需要几个小时才能完成的进程。我不需要知道状态或与之通信,但我需要在启动流程后立即重定向该视图 我尝试过使用subprocess.Popen,在新的线程.threading,多处理.Process中使用它。但是,父进程一直挂起,直到子进程终止。完成这项工作的唯一方法就是使用叉子。显然,这并不好,因为它会留下一个僵尸进程,直到父进程终止 这就是我在使用fork时要做的: if os.fork() == 0: subprocess.Popen(["/usr/

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

我尝试过使用
subprocess.Popen
,在新的
线程.threading
多处理.Process
中使用它。但是,父进程一直挂起,直到子进程终止。完成这项工作的唯一方法就是使用叉子。显然,这并不好,因为它会留下一个僵尸进程,直到父进程终止

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

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


如果它不适合您,那么尝试使用,作为Django的任务队列。用于它使用的工作。这里有一点关于如何简单地使用basing futures的信息,请查看kronos.py中的代码,以找到解决此问题的一种方法

所有这些的副本:,