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