2012-06-19 28 views
4

我在看文檔asynchronous fetch requests在GAE的請求。 Python不是我的第一語言,所以我很難找出最適合我的情況。我並不真正需要或關心對請求的響應,我只需要它發送請求並忘記它,然後轉到其他任務。異步獲取與谷歌App Engine的

所以,我想這樣的代碼的文件中:

from google.appengine.api import urlfetch 

rpc = urlfetch.create_rpc() 
urlfetch.make_fetch_call(rpc, "http://www.google.com/") 

# ... do other things ... 

try: 
    result = rpc.get_result() 
    if result.status_code == 200: 
     text = result.content 
     # ... 
except urlfetch.DownloadError: 
    # Request timed out or failed. 
    # ... 

但這代碼不起作用,除非我有try:except,我真的不關心。雖然省略了該部分,但請求仍未完成。

什麼是創建取,我不關心響應的要求,因此,它只是開始請求,並且進行到還有什麼其他的任務,永不回頭的最佳選擇?

+0

當你省略了嘗試發生/除非什麼?你有追溯嗎?是否總是提升DownloadError? – tesdal

+0

這是在生產服務器還是dev_appserver上,您發現請求沒有發送? – geoffspear

+0

這是開發服務器上,但低於Moishie說,這是該get_result()這是使抓取經歷,這讓我忽略希望這樣我就不必等待響應 – Snowman

回答

4

還是做你的任務,其中

# ... do other things ... 

評論是。當您另外完成時,請致電rpc.wait()。請注意,這並不是說計劃使工作try/except,它的get_result()電話。可以用wait()代替。

所以,你的代碼應該是這樣的:

from google.appengine.api import urlfetch 

rpc = urlfetch.create_rpc() 
urlfetch.make_fetch_call(rpc, "http://www.google.com/") 

# ... do other things ... << YOUR CODE HERE 

rpc.wait() 
+0

好東西就是「做其他事情」的一部分,我想發出一些數據的服務器響應,這樣就不會被髮送出去,直到RPC網址抓取完畢,不是嗎?如果urlfetch在一個單獨的函數中呢?所以我會打電話給do_async_request(),那麼在該函數調用之後我該怎麼做? – Snowman

+0

如果您想回應,請在您的任務隊列中設置您的urlfetch。 –

+1

(a)我認爲Moishe的意思是「rpc.wait()」; (b)在所有RPC(同步或異步)運行完成或超時之前,無法向用戶返回響應。所以是的,如果你正在進行一個你覺得很慢的urlfetch調用,並且你不想讓用戶不得不等待它,就把它放到任務隊列中。對於這種簡單的情況,延期模塊可能非常方便。在taks中,不要打擾使用異步API。 –

4

如果你不關心的響應,響應可能需要一段時間,而你不想讓你的處理程序等待它完成在向用戶返回響應之前,您可能需要考慮發起執行請求的task queue任務,而不是在面向用戶的處理程序中執行該任務。