14

使用GAE 1.5.0的新版本,我們現在可以輕鬆地執行異步數據存儲區調用。撥打 'put_async'後我們是否需要致電get_result()get_result()是Google App Engine中put_async()的必需調用

舉例來說,如果我有一個名爲MyLogData的模式,我可以叫:

put_async(MyLogData(text="My Text")) 

權利之前我處理程序返回而不調用匹配get_result()? 在將結果發送給客戶端之前,GAE是否會自動阻塞任何掛起的呼叫?

請注意,我並不真正在意處理錯誤情況。即我不介意這些投入是否失敗。

回答

7

我不認爲有任何確定的方法可以知道是否需要get_result(),除非GAE團隊中有人驗證這一點,但我認爲這不是必需的。這是我如何測試它。

我寫了一個簡單的處理程序:

class DB_TempTestModel(db.Model): 
    data = db.BlobProperty() 

class MyHandler(webapp.RequestHandler): 
    def get(self): 
     starttime = datetime.datetime.now() 
     lots_of_data = ' '*500000 
     if self.request.get('a') == '1': 
      db.put(DB_TempTestModel(data=lots_of_data)) 
      db.put(DB_TempTestModel(data=lots_of_data)) 
      db.put(DB_TempTestModel(data=lots_of_data)) 
      db.put(DB_TempTestModel(data=lots_of_data)) 
     if self.request.get('a') == '2': 
      db.put_async(DB_TempTestModel(data=lots_of_data)) 
      db.put_async(DB_TempTestModel(data=lots_of_data)) 
      db.put_async(DB_TempTestModel(data=lots_of_data)) 
      db.put_async(DB_TempTestModel(data=lots_of_data)) 
     self.response.out.write(str(datetime.datetime.now()-starttime)) 

我跑了一堆倍高複製的應用。

數據總是存在的,這讓我相信,除非數據存儲方面(不太可能)發生故障,否則會寫入數據。

以下是有趣的部分。當用put_async()?a=2)寫入數據時,(處理請求的)時間的平均速度約爲put()?a=1)的2到3倍(不是一個非常科學的測試 - 只是目測它)。

但是cpu_msapi_cpu_ms對於?a=1?a=2都是相同的。

從日誌:

ms=440 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244

VS

ms=149 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244

在客戶端,看着請求的網絡延遲,它顯示了同樣的結果,即`? a = 2'的請求速度至少要快2倍。絕對是客戶端的勝利......但在服務器端似乎沒有任何收益。

GAE團隊的任何人都在關心評論嗎?

2

我不知道,但這個工程:

import datetime 
from google.appengine.api import urlfetch 

def main(): 
    rpc = urlfetch.create_rpc() 
    urlfetch.make_fetch_call(rpc, "some://artificially/slow.url") 
    print "Content-type: text/plain" 
    print 
    print str(datetime.datetime.now()) 

if __name__ == '__main__': 
    main() 

遠程URL睡3秒鐘,然後向我發送一封電子郵件。 App Engine處理程序立即返回,遠程URL按預期完成。由於這兩個服務都提取了相同的底層RPC框架,我猜這個數據存儲的行爲類似。

不錯的問題。也許尼克或其他Google員工可以明確回答。

3

db.put_async部署時沒有get_result工作正常(在發射後不管的風格),但在locally it won't take action until get_result被稱爲more context

+0

這是不是一個錯誤;它是記錄的行爲。 dev_appserver是單線程的,而異步urlfetch僅僅是模擬的。 – geoffspear 2012-06-25 17:03:12

+0

@Wooble可以將我指向關於特殊本地開發服務器行爲的文檔嗎?我會直接關閉叢林(順便說一句:我指的是''db.put_async''和0影響) – lukmdo 2012-06-25 23:49:13

+0

Err,我誤讀了; asych urlfetch的這種行爲被記錄在案;它似乎沒有爲異步數據存儲記錄(儘管dev_appserver的單線程本身被記錄下來,似乎沒有在異步行爲的文檔中提及)。 – geoffspear 2012-06-26 01:33:48