2012-05-10 44 views
2

我有一個應用程序在後端實例上運行。它有11個任務。第一個是由/ _ah/start開始,然後又開始其他十個工作任務。該工作任務具有以下結構:任務隊列不會運行我所有的任務 - 應用引擎後端

done = False 
while not done: 
    do_important_stuff() 
    time.sleep (30) 
    if a_long_time_has_passed(): 
     done = True 

應用程序引擎上的執行行爲每次都是一樣的。計劃任務運行並排入10個輔助任務。前七個工作任務開始運行,正確執行。最後三名坐在隊列中,從不跑步。任務隊列應用程序控制臺顯示隊列中的所有十個任務,其中七個正在運行。

該應用程序還停止響應HTTP請求,返回503狀態碼與日誌沒有顯示我的http處理程序正在調用。

工作任務隊列配置最大速率爲1/s和2個存儲桶。很奇怪管理控制檯顯示強制執行速度爲0.1秒。由於任務永遠運行,它們不會返回不成功的完成狀態代碼。而CPU負載可以忽略不計。工作人員通常會進行網址提取,然後等待30秒再次完成。

日誌沒有幫助。我不知道該去哪裏尋找能幫助我弄清楚的診斷方法。我正在測試一個免費帳戶。可以同時執行8個任務的限制嗎?我在文檔中看不到這樣的情況,但我已經用完了想法。最後,我想同時運行更多的任務。

感謝您的任何建議,你可以給我。

回答

3

後端實例將處理多少個同時發生的請求是有限制的,聽起來就像是你正在進入該限制。

替代品包括:

  • 使用常規任務隊列,而不是針對後端
  • 開始後端的多個實例
  • 使用線程的人自己從一開始就要求啓動線程,而不是依靠任務隊列來爲你做它

需要注意的是,如果你的任務是CPU的約束,你不會從他們的運行10得到任何額外的好處超過5,2或甚至1.

+0

謝謝你的回覆,尼克。 8個同時請求的限制可以解釋我所看到的行爲,包括向我的實例發送http請求的客戶端看到的503。然而,我沒有找到關於這個主題的任何應用引擎文檔。只有線程安全應用程序和待處理隊列的「併發請求」引用。我有很多空閒的CPU週期。它看起來像我要使用線程,如果我要有效地使用實例。回到繪圖板。 – david193

+0

同時運行多少個線程與調度程序差不多 - 即使我們給出了一個穩定的限制,但是無法保證達到該限制,因爲在此之前可能會使CPU飽和。無論如何,如果你想在你的實例上運行固定數量的線程,無論如何,線程是一個更好的解決方案。你在做什麼需要這麼多的併發線程,但是不使用太多的CPU? –

+0

在我登錄帳戶並定期檢查新數據的情況下提取多個不同頁面的URL。 – david193