从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的角度运行一个完全独立的进程,并且伤亡最少?还是我做错了什么?
首先-试着用cron来完成你的任务,早就说是山雨。
如果它不适合您-那么尝试使用CeleryProject,用于Django的任务队列。它使用RabbitMQ来工作。这里有一点overview用于简单地使用基础期货
我不知道这是否适合您的情况,但是我要做的是:我使用一个任务队列(通过django模型);当调用视图时,它会在任务中输入一个新记录并愉快地重定向。而任务则由cron独立于django定期执行。
编辑:cron调用相关(和自定义)django命令来执行任务。
http://code.google.com/p/django-command-extensions/wiki/JobsScheduling
是一个很好的库,可以用来完成此任务。
相关问题 更多 >
编程相关推荐