3

假设我有一个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 中做到这一点?我应该为每个请求创建一个事件/条件/队列并将响应放在预定义的位置吗?如果是,哪种情况最适合这种情况?或者还有另一种方法可以做到这一点?

4

1 回答 1

1

您可以创建一个简单的类,其中包含一个Event和您的结果。

但是,严格来说事件是多余的,因为多个任务可以等待一个事件,而您不需要,因此您应该使用trio.hazmat.wait_task_rescheduled. 这也为您提供了一个钩子,当请求任务在收到其回复之前被取消时,您可以使用它来执行某些操作。

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

于 2018-03-12T08:03:53.467 回答