2015-05-09 81 views
10

我使用Gunicorn服務Django應用程序,它工作正常,直到我將其超時從30秒改爲900000s,我不得不這樣做,因爲我有一個用於獲取上傳大文件的用例並進行處理(在某些情況下,處理時間超過30米),但在此變化之後,Gunicorn在幾個小時後沒有響應,我想問題是在這段時間之後所有工作人員(30歲)都會忙於一些請求,奇怪的是即使我根本沒有運行這麼長的請求,它也發生在django管理員的正常探索中。我想知道是否有辦法監控gunicorn的請求,並看到工作人員忙於處理什麼請求,我想找出讓他們忙碌的請求。我試過--log-file=- --log-level=debug,但它沒有告訴任何關於請求的信息,我需要更詳細的日誌。Gunicorn沒有迴應

+0

我的預感是在你的一些請求處理代碼中可能存在死鎖。如果超時30秒,受影響的工人最終會解放。如果超過0.9兆秒,他們實際上不會。 –

+0

我明白了,這就是爲什麼我需要日誌,以瞭解發生了什麼。 – Sassan

回答

-1

雖然我也在尋找一個很好的答案來看看有多少員工在忙碌,但您正在以錯誤的方式解決這個問題。對於需要這麼長時間的任務,您需要像Celery/RabbitMQ這樣的工作人員異步完成繁重的工作,而您的請求/響應週期仍然很快。

我有我的網站上的腳本,可以採取5+分鐘內完成,這裏是我使用的良好格局:

  1. 當請求第一次進入時,產卵任務,並簡單地返回接受HTTP 202。其目的是「該請求已被接受處理,但處理尚未完成」。
  2. 讓您的前端輪詢相同的端點(每隔30秒就足夠了)。只要任務沒有完成,就返回一個202,並返回一個200,以及前端可能需要的任何數據。

對於我的網站,我們想要更新超過10分鐘的數據。我通過Accept-Datetime頭來指示數據的可用年齡。如果我們的本地緩存副本比這個更早,我們會產生任務週期。

+0

不,它不總是很好的解決方案,「通常」它是正確的,但並非總是如此。有時候,邏輯就是讓用戶等待,直到響應已準備就緒(然後需要)並向他顯示響應。在我的情況下,我需要這樣做,這就是爲什麼我在這裏問它(無論如何,我不是那個投下你的答案的人) – Sassan

+0

好吧,當然。我提出的通常只是答案。但你如何「讓用戶等待」?如果他們刷新了會發生什麼?這項工作是否繼續,還是必須重新開始。如果繼續,他們如何獲得狀態更新? – user3681414

+0

我剛剛建立了一個Datadog賬戶。他們與gunicorn整合,可以讓你看到有多少員工忙於免費。 – user3681414