python websockets 消息队列变得太长,导致消息过时

问题描述 投票:0回答:1

存在以下设计问题:我打开一个 websocket 连接并每秒发送多条消息以获得开放风险。

发生的情况是消息队列正在建立大量“陈旧”消息(来自频繁发送消息),当我发送交易订单并填充订单时,风险被延迟,因为它必须等待 while 循环在以正确的风险更新之前迭代所有旧消息

即,

websockets["messages"]
中的双端队列变得非常长,并且 while 循环需要一些时间才能赶上“最近”的消息

示例代码:

import websockets
url = 'wss://www.deribit.com/ws/api/v2'

risk1 = None
risk2 = None

async with websockets.connect(url) as ws:

     # send many messages every second, which builds up a lot of messages in the queue
     await send_message("private/get_positions", "btc-perpetual")
     await send_message("private/get_positions", "eth-perpetual")
     ....
     await send_message("private/get_positions", "sol-perpetual")

     # messages from above build up in a deque, which gets iterated one-at-a-time in while loop
     response = await ws.recv()
     if response["id"] == 100:
         risk1 = response["result"]
     elif response["id"] == 200:
         risk2 = response["result"]
     else:
         pass

     # message queue gets long, and messages go stale (response from ws.recv() ), resulting in out-of-date risk
     risk_usd = calculate_risk(risk1, risk2)
     if risk_usd > 0:
          await post_order()

我有一些想法,但不确定是否是好的做法:

  • 如果 > x 秒则忽略消息
  • 解压 websockets["messages"] 并选择最后一项

注意:每次迭代都会更新多个变量(risk1、risk2),并且所有变量都需要是最新的

python asynchronous websocket python-asyncio
1个回答
0
投票

也许尝试一下

await asyncio.sleep

而不是做

asyncio.sleep

在服务器端,如果您忘记了

await
关键字,服务器端不会等待发送。

我希望明白你的问题是什么,但也许我完全错了。

© www.soinside.com 2019 - 2024. All rights reserved.