【发布时间】:2019-01-19 00:48:18
【问题描述】:
我正在使用 Python 3.6、asyncio 和 websockets 库。我正在尝试为基于 websocket 的服务构建一个客户端,其工作方式如下:
客户端可以发送带有自定义id、method 和一些params 的JSON 请求。作为方法调用的结果,该服务将使用带有相同id 和data 的 JSON 有效负载进行回复。
我想在这个设备之上有一个抽象,它可以像这样工作:
wsc = get_websocket_connection()
async def call_method(method, **params):
packet = make_json_packet(method, params)
await wsc.send(packet)
resp = await wsc.recv()
return decode_json_packet(resp)
async def working_code():
separate_request = asyncio.ensure_future(call_method("quux"))
first_result = await call_method("foo", x=1)
second_result = await call_method("bar", y=first_result)
print(second_result)
return await separate_request
现在,我希望 separate_request 在处理 first_result 和 second_results 时异步等待。但是我不能保证wsc.recv() 调用会返回匹配的响应;事实上,我无法保证服务按请求的顺序返回响应。
我可以使用id 字段来消除响应的歧义。但是如何编写call_method() 以便它在内部管理请求并在收到相应回复时恢复“正确”协程?
【问题讨论】:
标签: python websocket python-asyncio