Будущее / Обещание, как материал для Трио в Python?
Скажи у меня класс Messenger
который отвечает за отправку и получение сообщений. Теперь у меня есть служба, которая отправляет запросы и ожидает ответов через нее, сопоставляя каждую пару с полем id в сообщении. В asyncio я бы сделал:
class Service:
...
async def request(self, req):
new_id = self._gen_id()
req.id = new_id
fu = asyncio.Future()
self._requests[new_id] = fu
await self._messenger.send(req)
return await fu
def handle_response(self, res):
try:
fu = self._requests.pop(res.req_id)
except KeyError:
return
fu.set_result(res)
Таким образом, я мог отправить несколько запросов от разных задач, и в каждой задаче ждать соответствующего ответа. (И некоторые сообщения могут не иметь соответствующего ответа, который обрабатывается другим способом.)
Но как мне это сделать в Трио? Должен ли я создать событие / условие / очередь для каждого запроса и поместить ответ в заранее определенное место? Если да, что лучше для этого сценария? Или есть другой способ сделать это?
1 ответ
Вы можете создать простой класс, который содержит Event
и твой результат.
Однако, строго говоря, события излишни, потому что несколько событий могут ждать события, которое вам не нужно, поэтому вы должны использовать trio.hazmat.wait_task_rescheduled
, Это также дает вам ловушку, которую вы можете использовать, чтобы сделать что-то, когда запрашивающая задача отменяется до получения ее ответа.