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