2012-11-19 70 views
1

我在導致DeadlineExceededError的任務隊列中有一個長時間運行的進程,因爲任務可能需要超過10分鐘。正如我在this question中所描述的那樣,長時間運行的進程有一個for循環,用於循環計算用於創建kml文件的大型字典中的新值。任務目前看起來是這樣的:從GAE中的任務獲取數據以形成任務隊列循環的最佳方式是什麼?

class longprocess_handler(webapp2.RequestHandler): 
def post(self): 
#This is currently one task that recursively uses data in dictionaries to 
#produce kml files every few minutes 
    for j in range(0, Time): 
    # Processes data from dictionaries sequentially in this for loop 
    # Sends message to client to request the data. 

我想使這一過程分成幾個小任務,比如:

class longprocess_handler(webapp2.RequestHandler): 
def post(self): 
    for j in range(0, Time): 
     # Send dictionaries to smaller task 
     CallSmallerTask_handler(dictionaries) 
     # Receive dictionaries back from task. (How do I do this?) 
     # Repeat for loop with new dictionaries to call next task. 

有沒有辦法從任務找回數據,這樣我可以創建一個使用前一個任務的結果按順序創建的小任務循環?我是否需要將前一個任務中的字典存儲在數據存儲中,然後檢索它們以創建下一個任務? (我希望避免這種情況,因爲字典非常大,我認爲這可能很困難)。

回答

3

您必須將大型字典存儲到數據存儲中。只有在一個任務的輸出相對較小(而不是您的情況)的情況下,可以將輸出作爲參數傳遞給任務的處理程序。

一種可能的優化方法是使用ndb或在數據存儲區頂部實現自己的緩存層,這樣就可以從緩存中完成很多百分比的讀取調用,並且永遠不會到達數據存儲區。請記住,應該對緩存和數據存儲進行存儲,因爲緩存不是100%可靠的。

+0

這回答了我的問題,即結果需要存儲在數據存儲中。我將嘗試使用Peter Knego建議的後端任務隊列來避免此問題。謝謝! – dave

+0

@Jay:OP正在詢問如何從任務中取回數據,而不是將數據傳遞給它。傳遞給任務的數據限制爲100KB,因此它不是那麼小:https://developers.google.com/appengine/docs/java/taskqueue/overview-push#Quotas_and_Limits_for_Push_Queues –

4

您可以簡單地​​。這將解除10分鐘的執行限制。

+0

在後端使用任務隊列似乎是最好的選擇,我將使用它。這意味着我的問題的答案是,沒有一種有效的方法可以在不使用數據存儲的情況下從任務中獲取大量結果。謝謝! – dave

+1

任務異步執行,所以當任務完成時,「返回」數據的唯一方法是將其存儲在數據存儲(= datastore,memcache,blobstore等)中,或將其傳遞給另一個請求(=調用另一個url並傳遞數據在請求的主體中)。請求被限制在32Mb的大小。 –

相關問題