2013-09-24 29 views
3

我正在開發一個django web應用程序,該應用程序具有需要很長時間才能返回的功能(比如說sync_files())。當我使用gevent時,當sync_file()運行並且其他客戶端可以連接並與webapp交互時,我的app不會阻塞。當我使用gevent時,我需要芹菜嗎?

我的目標是讓webapp響應其他客戶端,而不是阻止。我不希望有數以億計的用戶連接到我的webapp(最多20個連接),我不想將它設置爲下一個推特。我的應用程序運行在vps上,所以我需要一些重量輕的東西。

因此,在我上面列出的情況下,當我使用gevent時使用芹菜是多餘的?使用芹菜有特定的優勢嗎?我更喜歡不使用芹菜,因爲它是我的機器上運行的又一項服務。

編輯:發現芹菜可以在gevent上運行工人池。我認爲我是一個更加不確定芹菜的gevent &之間的關係。

回答

3

總之,你需要一個芹菜。

即使您使用gevent並具有併發性,問題也會變成請求超時。假設您的任務需要10分鐘才能運行,但典型的請求超時大約需要一分鐘。因此,如果您在視圖中直接觸發任務會發生什麼情況,服務器將開始處理它,但是一分鐘後客戶端(瀏覽器)可能會斷開連接,因爲它會認爲服務器處於脫機狀態。因此,您的數據可能會損壞,因爲無法保證連接關閉時會發生什麼情況。 Celery解決了這個問題,因爲它會觸發一個後臺進程來處理獨立於視圖的任務。因此,用戶將立即獲得查看響應,同時服務器將開始處理任務。這是處理任何需要大量處理的場景的正確模式。

+0

感謝您的答覆 - 我目前正在使用RQ從python-rq.org進行排隊......我正確地認爲芹菜和RQ執行類似的功能(沒有進入架構差異)嗎?我應該在我的問題中加入關於RQ的說明 - 對不起。 – Trewq

+2

是的。他們假設做相同/類似的事情。 – miki725