2014-10-04 36 views
2

我需要在Web應用程序的後臺運行一些任務(檢查代碼等)而不阻止視圖。金字塔web應用程序中的長時間運行任務

典型Queue/Celery方案的轉折是,我必須確保任務將完成,甚至生存的web應用程序死機或重啓,直到這些任務完成後,無論其最終結果。

我正在考慮在數據庫中記錄multiprocessing.Pool的參數,並在webapp重新啓動時啓動所有不完整的任務。這是可行的,但我想知道是否有一個更簡單或更具成本效益的方法?

更新:爲什麼不芹芹本身?那麼,我在一些項目中使用了Celery,這確實是一個很好的解決方案,但是對於這個任務來說它是非常重要的:它需要一個單獨的服務器,通信等,而我需要的只是產生一些進程/線程,在他們的工作(git clone ...,svn co ...),並檢查他們是否成功或失敗。另一個問題是,我需要解決方案儘可能小,因爲我必須遵循精心制定的企業準則,程序等,以及我必須經過的人力行政和官僚開銷才能獲得Celery。如果可以,我寧願避免。

+0

您提到了芹菜 - 是什麼讓你解僱它並創造你自己的解決方案?該任務看起來像Celery – Sergey 2014-10-04 19:27:47

+0

@Sergey的典型用例:請參閱UPDATE – LetMeSOThat4U 2014-10-05 13:15:48

回答

2

我建議你使用芹菜。

芹菜不需要自己的服務器,你可以讓一個工人在同一臺機器上運行。您也可以使用SQL數據庫而不是「真正的」隊列/消息服務器(比如RabbitMQ)來建立一個「窮人隊列」 - 這個設置看起來非常類似於您所描述的內容,只有通過一個獨立的進程來執行長期的操作,運行任務。

從網絡服務器進程開始長時間運行的任務的問題是,在生產環境中,網絡「工作人員」通常由網絡服務器管理 - 可隨時產生或殺死多個工作人員。您的方法的可行性將高度依賴於您使用的Web服務器及其配置。另外,如果多個工作人員都嘗試執行某項任務,則可能會遇到一些併發問題。

除了芹菜,另一種選擇是看UWSGI's spooler subsystem,尤其是如果你已經使用UWSGI。

相關問題