Python asyncio:通过单个websocket连接多路传输消息

Python asyncio:通过单个websocket连接多路传输消息,python,websocket,python-asyncio,Python,Websocket,Python Asyncio,我正在使用Python3.6、asyncio和库。我正在尝试为基于websocket的服务构建一个客户端,其工作原理如下: 客户端可以使用自定义的id、方法和一些参数发送JSON请求。作为方法调用的结果,该服务将使用相同的id回送的JSON负载和data进行应答 我希望在这个设备上有一个抽象,它的工作原理如下: wsc=get\u websocket\u connection() 异步def调用方法(方法,**参数): packet=make_json_packet(方法,参数) 等待wsc发送

我正在使用Python3.6、asyncio和库。我正在尝试为基于websocket的服务构建一个客户端,其工作原理如下:

客户端可以使用自定义的
id
方法
和一些
参数
发送JSON请求。作为方法调用的结果,该服务将使用相同的
id
回送的JSON负载和
data
进行应答

我希望在这个设备上有一个抽象,它的工作原理如下:

wsc=get\u websocket\u connection()
异步def调用方法(方法,**参数):
packet=make_json_packet(方法,参数)
等待wsc发送(数据包)
resp=wait wsc.recv()
返回解码json数据包(resp)
异步def工作_代码():
分离请求=异步。确保未来(调用方法(“quux”))
第一个结果=等待调用方法(“foo”,x=1)
第二个结果=等待调用方法(“bar”,y=第一个结果)
打印(第二次结果)
返回等待单独的请求
现在,我希望
separate\u请求
在处理
第一个结果
第二个结果
时异步等待。但是我不能保证
wsc.recv()
调用将返回匹配的响应;事实上,我不能保证服务会按请求的顺序返回响应


我可以使用
id
字段来消除响应的歧义。但是,我如何编写
call_method()
,以便它在内部管理请求,并在收到相应的答复时恢复“正确”的协同程序呢?

当我以前做过这类事情时,我倾向于将事情分为两部分:

  • “发送代码”(可以是多个线程)设置响应应该到达的位置(即
    id
    s的
    dict
    到函数或
    Future
    s),然后发送请求和响应块
  • “接收代码”(每个套接字可能有一个线程),用于监视所有入站流量,并将响应传递给对
    id
    感兴趣的代码。这也是处理意外关闭的套接字的一个合理位置,它应该在适当的时候将异常推出
  • 这可能是几百行代码和相当特定的应用程序