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

2024-06-16 12:38:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是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_resultsecond_result时异步等待。但是我不能保证wsc.recv()调用将返回匹配的响应;事实上,我不能保证服务按请求的顺序返回响应。你知道吗

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


Tags: asyncioidjsonpacketrequestparamsresultawait
1条回答
网友
1楼 · 发布于 2024-06-16 12:38:36

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

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

这可能是几百行代码和相当具体的应用程序

相关问题 更多 >