2010-06-29 33 views
5

我張望了一下看着執行使用subprocess.Popen()的Python腳本,但我似乎無法來解決這個問題,我有。我想在我的django應用程序的視圖內執行一個python腳本。我已經將要執行的代碼放入django管理命令中,以便通過命令行python manage.py command-name訪問它。然後我嘗試使用subprocess.Popen("python manage.py command-name",shell=True)來運行此命令。在Django視圖

但是,該命令可能需要一些時間來執行,所以我想認爲繼續並允許腳本在後臺執行。使用subprocess.Popen單獨似乎使視圖掛起,直到劇本已經完成,所以我嘗試使用一個線程(以下another SA問題):

class SubprocessThread(threading.Thread): 
def __init__(self, c): 
    self.command = c 
    self.stdout = None 
    self.stderr = None 
    threading.Thread.__init__(self) 

def run(self): 
    p = subprocess.Popen(self.command, 
         shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

    self.stdout, self.stderr = p.communicate() 

,然後執行它:

t = SubprocessThread("python manage.py command-name") 
t.setDaemon(True) 
t.start() 
t.join() 

但是,視圖仍然掛起:光標有一個忙符號,頁面上的AJAX不加載。否則,在線程調用看起來正常完成(在腳本完成之前)之後,頁面的html似乎在視圖中正常加載和命令。有人可以幫幫我嗎?我希望腳本能夠執行並自己做,而不必在頁面上保留視圖或AJAX調用。

+0

我經常使用類似的模式(以'subprocess',因爲'thread'被殺害視圖功能退出時),並且我經常忘記在返回的東西查看功能,使瀏覽器掛起。然後,我責怪subporcess,而我只是忘了返回一個'HttpResponse'。檢查一下! – Dunatotatos 2017-10-31 08:23:44

回答

3

也許你應該使用celery

芹菜分佈式消息傳遞基礎 任務隊列/作業隊列。據 專注於實時操作

1

我浪費了很多時間試圖實現類似的東西,但有同樣的問題你。最終,我放棄並實施了一個豆莖隊列來處理這項工作。

http://kr.github.com/beanstalkd/

我把在Django的視圖中的隊列中的ID,然後有一個管理命令運行消費者(通過supervisord觀看)。

使用隊列意味着你可以擴展到多個消費者,並允許更好地管理負載(如果有必要暫停消費者又不失所需的工作)。