【问题标题】:asyncio: multiplexing messages over single websocket connectionasyncio:通过单个 websocket 连接多路复用消息
【发布时间】:2019-01-19 00:48:18
【问题描述】:

我正在使用 Python 3.6、asyncio 和 websockets 库。我正在尝试为基于 websocket 的服务构建一个客户端,其工作方式如下:

客户端可以发送带有自定义idmethod 和一些params 的JSON 请求。作为方法调用的结果,该服务将使用带有相同iddata 的 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_resultsecond_results 时异步等待。但是我不能保证wsc.recv() 调用会返回匹配的响应;事实上,我无法保证服务按请求的顺序返回响应。

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

【问题讨论】:

    标签: python websocket python-asyncio


    【解决方案1】:

    当我在倾向于将事情分成两部分之前做过这种事情时:

    1. “发送代码”(可以是多个线程)这设置响应应该到达的位置(即ids 的dict 到函数或Futures),然后发送请求并阻止响应
    2. “接收代码”(可能每个套接字一个线程)监控所有入站流量并将响应传递给对id 感兴趣的任何代码。这也是一个处理套接字意外关闭的合理地方,应该适当地推出异常

    这可能只有几百行代码,而且非常适用于特定应用程序……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2016-11-19
      • 2017-09-30
      • 2015-01-19
      相关资源
      最近更新 更多