Будущее / Обещание, как материал для Трио в 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, Это также дает вам ловушку, которую вы можете использовать, чтобы сделать что-то, когда запрашивающая задача отменяется до получения ее ответа.

http://trio.readthedocs.io/en/latest/reference-hazmat.html

Другие вопросы по тегам