我有一個django項目與各種應用程序,這是完全獨立的。我想讓他們在自己的進程中運行每一個進程,因爲他們中的一些產生後臺線程來週期性地預先計算一些數據,現在他們正在爭奪CPU(該機器有很多內核,但是你知道,GIL和這樣的...)拆分Django項目
那麼,有沒有一種簡單的方法,以項目自動分割成不同的人,或者至少使每個應用程序住在自己的進程?
我有一個django項目與各種應用程序,這是完全獨立的。我想讓他們在自己的進程中運行每一個進程,因爲他們中的一些產生後臺線程來週期性地預先計算一些數據,現在他們正在爭奪CPU(該機器有很多內核,但是你知道,GIL和這樣的...)拆分Django項目
那麼,有沒有一種簡單的方法,以項目自動分割成不同的人,或者至少使每個應用程序住在自己的進程?
你總是可以有不同的設置文件,但會像有多個項目,甚至多個端點。通過一些努力,您可以根據請求的路徑等配置反向代理以轉發到正確的Django服務器,但我不認爲這就是您想要的,這對您的問題會是一個醜陋的解決方案。
解決方法是將繁重的處理移動到作業隊列。很多人和項目都喜歡Celery。
如果這似乎有點小題大做出於某種原因,你總是可以實現自己的基於簡單的cron作業。你可以看看my small project這樣做。
最簡單的簡單的可能是寫一個custom management command是觀察新的條目給定的模型(數據庫表),並對其進行處理。該模型由例如Django視圖和管理命令從cron定期啓動(例如每5分鐘)。
實施例:在網站上的用戶寄存器,但帳戶創建是昂貴的操作(分配一些空間,操作遠程服務等)。因此,您只需向AccountRequest表(AccountRequest.objects.create(...)
)寫入新記錄。然後,cron定期啓動管理腳本(./manage.py account_creator
),該腳本檢查新的AccountRequest-s(AccountRequest.objects.filter(unprocessed=True)
),完成其工作並將這些請求標記爲已處理。
這工作,我也這樣做,但你可能會遇到問題,因爲競爭條件可能會發生,這就是爲什麼我更喜歡一個更通用的解決方案,有這個小小的壯舉。 – 2012-02-03 13:03:20
@亞歷山大:你的意思是什麼樣的競爭條件? – 2012-02-03 13:13:02
Tomasz,根據定義,後臺作業緩慢且不可預測,cron.d不關心這個問題。有一次,我最終處於一個原始進程開始的速度太慢而無法在分配的X分鐘內完成的情況,所以cron一直在啓動進程,這最終導致我的服務器完全停止:-) ...並且還有2個進程正在處理相同的數據,然後打開另一個蠕蟲的可能性。所以必須注意確保這兩件事情不會發生。 – 2012-02-03 13:36:54
芹菜是一個選項,當谷歌搜索我的問題的解決方案,我認爲它可能是值得研究它:-) – fortran 2012-02-03 12:41:01