Pull to refresh

Асинхронный RPC

Reading time1 min
Views1.5K
Original author: Guido van Rossum
В то время, как я закладываю основу новой клиентской библиотеки для работы с Datastore с поддержкой асинхронных запросов, я добавил кое-какой низкоуровневый функционал, который Вы можете использовать уже сегодня. Единственный API с документированной поддержкой асинхронных запросов – это urlfetch. И этот функционал может оказаться довольно полезным.

Предположим, нам необходимо выбрать определенные данные с удаленного сервиса. Сервис имеет 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(), который ожидает завершения всех запросов (он ничего не возвращает).
Tags:
Hubs:
Total votes 7: ↑4 and ↓3+1
Comments0

Articles