Future/Promise 喜欢 Python 中的三重奏?

Future/Promise like stuff for Trio in Python?

假设我有一个 class 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)

所以我可以从不同的任务发出多个请求,并在每个任务中等待相应的响应。 (有些消息可能没有相应的响应,以另一种方式处理。)

但我如何在 Trio 中执行此操作?我应该为每个请求创建一个事件/条件/队列并将响应放在预定义的位置吗? 如果是,哪个最适合这种情况?或者还有其他方法吗?

您可以创建一个包含 Event 和您的结果的简单 class。

然而,严格来说事件是矫枉过正的,因为多个任务可以等待一个事件,而这是您不需要的,因此您应该使用 trio.hazmat.wait_task_rescheduled。这也为您提供了一个挂钩,当请求任务在收到回复之前被取消时,您可以使用它来做一些事情。

http://trio.readthedocs.io/en/latest/reference-hazmat.html#low-level-blocking