2009-02-13 100 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看起來像是可能成爲未來排隊/消息傳遞需求的有力競爭者。希望這可以幫助!

相關問題