2014-01-09 43 views
0

App Engine文檔指出您不應使用lambda functions with the deferred library延遲任務中的App Engine Lambda函數限制

1)此限制僅適用於使用lambda keyword的功能嗎?還是它也限制傳遞函數延遲任務?

def formatA(a): 
    return a.upper() 

def formatB(b): 
    return b.capitalize() 

def applyFormat(elements, format_funcs): 
    for i, element in enumerate(elements): 
     formatted_element = format_funcs[i](element) 

deferred.defer(applyFormat, (a,b), (normalizeA, normalizeB)) 

2)此限制是否也適用於任務隊列?

3)爲什麼?這是因爲lambda函數不能被酸洗?

回答

0

看了一下後,我想出了答案。首先,看起來我正在合併兩件事:限制您可以從延遲庫調用的內容以及對可以發送的參數的限制。

調用lambda函數有一個限制。

你不能調用lambda函數(但你可能不想 反正)。

這意味着下面的行不通。

deferred.defer(lambda x: x.upper(), x) 

與此同時,有一個限制,即被調用函數的參數必須是可選的。有一組有限的函數可供選擇,並且不包括lambda函數。 (What can be pickled and unpickled?Pickling lambda functions

所以回答我的問題:

  1. lambda函數將失敗作爲參數傳遞給延遲庫。所以大多數函數都會被定義在模塊的頂部。

  2. 調用lambda函數的限制不適用於任務隊列。通過任務隊列,您可以對URL進行發佈,因此您需要設置請求處理程序,並且該請求處理程序可以將lambda函數調用到其內容中。但是,仍然有一個侷限性,即任務隊列的參數需要爲http POST序列化,因此函數可能不是你想要傳遞的東西。

  3. 是的,見上文。