В то время, как я закладываю основу новой клиентской библиотеки для работы с Datastore с поддержкой асинхронных запросов, я добавил кое-какой низкоуровневый функционал, который Вы можете использовать уже сегодня. Единственный API с документированной поддержкой асинхронных запросов – это urlfetch. И этот функционал может оказаться довольно полезным.
Предположим, нам необходимо выбрать определенные данные с удаленного сервиса. Сервис имеет 2 инстанса, оба из которых немного нагружены. То, что мы хотим сделать, это послать запросы обоим сервисам одновременно (это легкая часть), и затем дождаться результата от одного из них.
Вот и все! Если Вы хотите узнать больше об этом полезном функционале, загляните в docstring в App Engine SDK.
Вы также можете неоднократно вызывать wait_any(), чтобы получить следующий ответ. Удостоверьтесь, что удалили отработанный запрос из списка: спецификация wait_any() подсказывает, что возвращается первый завершенный запрос из списка, независимо от того, смотрели Вы его или нет.
Также имейте ввиду, что в данный момент нет функционала для отмены других запросов. Проблема в том, что даже если Вы будете игнорировать другие запросы, App Engine Runtime всеравно будет ожидать их выполнения или таймаута.
Наконец, есть еще один похожий метод UserRPC.wait_all(), который ожидает завершения всех запросов (он ничего не возвращает).
Предположим, нам необходимо выбрать определенные данные с удаленного сервиса. Сервис имеет 2 инстанса, оба из которых немного нагружены. То, что мы хотим сделать, это послать запросы обоим сервисам одновременно (это легкая часть), и затем дождаться результата от одного из них.
from google.appengine.api import urlfetch, apiproxy_stub_map
urls = ['http://service1.com', 'http://service2.com'] # Etc.
rpcs = []
for url in urls:
rpc = urlfetch.create_rpc(deadline=1.0)
urlfetch.make_fetch_call(rpc, url)
rpcs.append(rpc)
rpc = apiproxy_stub_map.UserRPC.wait_any(rpcs)
# Now rpc is the first rpc that returned a result. Have at it!
Вот и все! Если Вы хотите узнать больше об этом полезном функционале, загляните в docstring в App Engine SDK.
Вы также можете неоднократно вызывать wait_any(), чтобы получить следующий ответ. Удостоверьтесь, что удалили отработанный запрос из списка: спецификация wait_any() подсказывает, что возвращается первый завершенный запрос из списка, независимо от того, смотрели Вы его или нет.
Также имейте ввиду, что в данный момент нет функционала для отмены других запросов. Проблема в том, что даже если Вы будете игнорировать другие запросы, App Engine Runtime всеравно будет ожидать их выполнения или таймаута.
Наконец, есть еще один похожий метод UserRPC.wait_all(), который ожидает завершения всех запросов (он ничего не возвращает).