2012-06-19 2 views
4

Я читаю документацию для asynchronous fetch requests в GAE. Python - не мой первый язык, поэтому у меня возникли проблемы с выяснением того, что было бы лучше для моего дела. Мне действительно не нужно или не нужно отвечать на запрос, мне просто нужно отправить запрос и забыть об этом и перейти к другим задачам.Запрос асинхронной выборки с Google 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

Что происходит, когда вы опускаете try/except? Вы получаете трассировку? Всегда ли загружается DownloadError? – tesdal

+0

Это на производственном сервере или dev_appserver, что вы замечаете, что запросы не отправляются? – geoffspear

+0

Это на сервере-разработчике, но Мойши ниже говорит, что это 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 не будет закончен, нет? А что, если urlfetch находится в отдельной функции? Поэтому я бы назвал do_async_request(), а затем как я мог делать что-то после вызова этой функции? – Snowman

+0

Если вы хотите ответить, тогда вместо этого настройте свой urlfetch в очереди задач. –

+1

(a) Я думаю, что Мойше имел в виду «rpc.wait()»; (b) нет способа вернуть ответ пользователю до того, как все ваши RPC (синхронные или асинхронные) будут выполняться до завершения или таймаута. Так что да, если вы делаете вызов urlfetch, который, по вашему мнению, медленный, и вы не хотите, чтобы он ожидал его, поместите его в очередь задач. Отложенный модуль может быть удобен для этого простого случая. В taks, не утруждайте себя использованием асинхронного API. –

4

Если вы не заботитесь о реакции, ответ может занять некоторое время, и вы не хотите, чтобы ваш обработчик ждать его завершения перед возвратом ответа пользователю может потребоваться отключение задания task queue, которое делает запрос, а не делает его в вашем обработчике, обращенном к пользователю.

Смежные вопросы