我正在为用户创建一个小仪表板,以便他能够运行特定的工作。我正在使用Django所以我希望他能够单击一个链接来启动作业,然后将页面返回给他,并显示作业正在运行的消息。这份工作的结果将在稍后通过电子邮件发送给他。
我相信我应该使用subprocess.Popen
,但我不确定。所以在伪代码中,这就是我想要做的事情:
if job == 1:
run script in background: /path/to/script.py
return 'Job is running'
答案 0 :(得分:62)
p = subprocess.Popen([sys.executable, '/path/to/script.py'],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
这将在后台启动子进程。您的脚本将继续正常运行。
阅读文档here。
答案 1 :(得分:6)
如果您正在考虑长期扩展,那么通过消息队列运行它绝对是可行的方法。将消息发送到后台不断运行的队列,并编写作业处理程序来处理不同类型的消息。
由于您使用的是Django,我认为Beanstalkd非常合适。 Here's关于这个主题的非常好的教程。该文章中的第一条评论也有一些很好的提示。
就个人而言,我已经推出了一个用Erlang编写的自定义内存中队列服务器,其中Python绑定用C语言编写。但是redis看起来可能会成为未来排队/消息传递的有力竞争者 - 需要。希望这有帮助!
答案 2 :(得分:3)
subprocess.Popen确实是你要找的。 p>
答案 3 :(得分:1)
虽然如果您发现要在子进程和父进程之间开始传递大量信息,您可能需要考虑一个线程或RPC框架,如Twisted。
但很可能那些对你的申请来说太重了。