这个问题在这里已经有答案了:

我正在为用户创建一个小仪表板,允许他运行特定的作业。我正在使用 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,我想 豆茎 是一个非常合适的选择。 这是 关于这个主题的一个非常好的教程。该文章的第一条评论也有一些很好的提示。

就我个人而言,我使用了用 Erlang 编写的自定义内存队列服务器,以及用 C 编写的 Python 绑定。但 雷迪斯 看起来它可能会成为未来排队/消息传递需求的有力竞争者。希望这可以帮助!

subprocess.Popen 确实是您正在寻找的。

尽管如果您发现想要开始在子进程和父进程之间通信大量信息,您可能需要考虑线程或像 Twisted 这样的 RPC 框架。

但很可能这些对于您的应用来说太重了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top