我使用的是python3.6、asyncio和websockets库。我正在尝试为基于websocket的服务构建一个客户端,其工作方式如下:
客户机可以发送带有自定义id
、一个method
和一些params
的JSON请求。服务将使用一个JSON负载进行应答,该负载具有相同的id
回声,并且作为方法调用的结果data
。你知道吗
我想在这个设备上有一个抽象的东西,它的工作原理是这样的:
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_result
时异步等待。但是我不能保证wsc.recv()
调用将返回匹配的响应;事实上,我不能保证服务按请求的顺序返回响应。你知道吗
我可以使用id
字段来消除响应的歧义。但是,如何编写call_method()
,以便它在内部管理请求,并在收到相应的回复时恢复“正确”的协同路由呢?你知道吗
当我以前做过这类事情时,我倾向于把事情分成两部分:
dict
或id
到函数或Future
),然后为响应发送请求和块id
感兴趣的代码。这也是处理意外关闭的套接字的一个明智的地方,它应该适当地将异常推出这可能是几百行代码和相当具体的应用程序
相关问题 更多 >
编程相关推荐