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