我正在为用户创建一个小仪表板,允许他运行特定的作业。我使用 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)
那会在后台启动子进程。你的脚本将正常运行。
在这里阅读文档here。
如果您考虑到长期扩展,通过消息队列运行是明智的选择。向后台持续运行的队列发送消息,并编写作业处理程序以处理不同类型的消息。
由于您正在使用Django,我认为Beanstalkd是一个相当好的选择。 这里有一个非常好的教程。该文章中的第一条评论也有一些很好的提示。
就我个人而言,我使用了一个自定义的内存队列服务器,用Erlang编写,在C中编写Python绑定。但是,redis看起来可能成为未来排队/消息需求的一个很好的竞争者。希望这可以帮助您!
subprocess.Popen确实是您要寻找的内容。
虽然如果你发现你想在子进程和父进程之间开始传递大量信息,你可能需要考虑使用线程或类似Twisted的RPC框架。
但很可能这些对于你的应用程序来说太重了。