2009-02-13 54 views
38

我正在为用户创建一个小仪表板,让他可以运行特定的工作。我正在使用Django,所以我希望他能够点击链接来启动作业,然后将该页面返回给他,并显示作业正在运行的消息。该工作的结果将在稍后通过电子邮件发送给他。如何在Python中运行另一个脚本而无需等待它完成?

我相信我应该使用subprocess.Popen但我不确定。因此,在伪代码,这里是我想做的事:

if job == 1: 
    run script in background: /path/to/script.py 
    return 'Job is running' 
+0

** [在Python启动后台进程](http://stackoverflow.com/questions/1196074/starting-a-background-process-in-python)**和** [如何启动并在后台运行外部脚本?](http://stackoverflow.com/questions/1605520/how-to-launch-and-run-external-script-in-background)** – olibre 2013-11-13 09:32:49

回答

61
p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
            stdout=subprocess.PIPE, 
            stderr=subprocess.STDOUT) 

,将开始在后台的子进程。你的脚本将继续正常运行。

阅读文档here

+0

nosklo:谢谢。我如何将参数传递给脚本? – sheats 2009-02-13 14:09:34

+3

作为第一个参数传递的列表中的其他元素。链接的文档很有用,并且有一个原因。 – 2009-02-13 14:28:31

3

subprocess.Popen的确是你在找什么。

1

尽管如果你发现你想开始在子进程和父进程之间传递一堆信息,你可能需要考虑一个线程,或像Twisted这样的RPC框架。

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

6

如果您考虑长期扩展,那么通过消息队列运行它绝对是您的选择。向在后台不断运行的队列发送消息,并写入作业处理程序来处理不同种类的消息。

由于您使用的是Django,因此我认为Beanstalkd非常合适。 Here's关于这个问题的一个很不错的教程。该文章的第一条评论也有一些很好的提示。

个人而言,我已经使用用Erlang编写的定制内存中队列服务器进行了编译,并使用了用C语言编写的Python绑定。但redis看起来像是可能成为未来排队/消息传递需求的有力竞争者。希望这可以帮助!

相关问题