【发布时间】:2020-12-10 18:01:18
【问题描述】:
我正在尝试使用 asyncio 和 websocket 创建一个脚本,该脚本应该连接到 4-5 个加密货币交易所 websocket,并从这些交易所实时接收交易。我的代码有效,而且非常简单,如下所示:
import asyncio
import websockets
import json
subscriptions = ['btcusdt@trade', 'ethusdt@trade', 'bchusdt@trade', 'xrpusdt@trade', 'eosusdt@trade', 'ltcusdt@trade', 'trxusdt@trade', 'etcusdt@trade', 'linkusdt@trade', 'xlmusdt@trade', 'adausdt@trade', 'xmrusdt@trade', 'dashusdt@trade', 'zecusdt@trade', 'xtzusdt@trade', 'bnbusdt@trade', 'atomusdt@trade', 'ontusdt@trade', 'iotausdt@trade', 'batusdt@trade', 'vetusdt@trade', 'neousdt@trade', 'qtumusdt@trade', 'iostusdt@trade', 'thetausdt@trade', 'algousdt@trade', 'zilusdt@trade', 'kncusdt@trade', 'zrxusdt@trade', 'compusdt@trade', 'omgusdt@trade', 'dogeusdt@trade', 'sxpusdt@trade', 'kavausdt@trade', 'bandusdt@trade', 'rlcusdt@trade', 'wavesusdt@trade', 'mkrusdt@trade', 'snxusdt@trade', 'dotusdt@trade', 'defiusdt@trade', 'yfiusdt@trade', 'balusdt@trade', 'crvusdt@trade', 'trbusdt@trade', 'yfiiusdt@trade', 'runeusdt@trade', 'sushiusdt@trade', 'srmusdt@trade', 'bzrxusdt@trade', 'egldusdt@trade', 'solusdt@trade', 'icxusdt@trade', 'storjusdt@trade', 'blzusdt@trade', 'uniusdt@trade', 'avaxusdt@trade', 'ftmusdt@trade', 'hntusdt@trade', 'enjusdt@trade', 'flmusdt@trade', 'tomousdt@trade', 'renusdt@trade', 'ksmusdt@trade', 'nearusdt@trade', 'aaveusdt@trade', 'filusdt@trade', 'rsrusdt@trade', 'lrcusdt@trade', 'maticusdt@trade', 'oceanusdt@trade', 'cvcusdt@trade', 'belusdt@trade', 'ctkusdt@trade', 'axsusdt@trade', 'alphausdt@trade', 'zenusdt@trade', 'sklusdt@trade']
async def connect():
while True:
async with websockets.client.connect('wss://fstream.binance.com/ws/trade') as ws:
tradeStr = {"method": "SUBSCRIBE", "params": subscriptions, 'id': 1}
await ws.send(json.dumps(tradeStr))
while True:
try:
msg = await asyncio.wait_for(ws.recv(), 5)
message = json.loads(msg)
try:
print(message)
except Exception as e:
print(e)
except asyncio.TimeoutError:
break
asyncio.get_event_loop().run_until_complete(connect())
在上面的示例中,我正在连接到 Binance,并且我正在接收所有可用市场的交易。我这样做是为了一次进行更多的交流,但只要我每秒收到很多消息,问题也会发生。
每条消息都像这样{"rate": "xx", "market": "xx", "amount": "xx", "side": "xx"},非常小。
我注意到的一个大问题是,在脚本运行一段时间后,我开始收到较少的消息,很多消息会在很多秒后出现,而我什至没有收到很多其他消息,好像他们迷路了,或者好像连接被冻结了。
现在,我知道这不是一个非常具体的问题,但这里可能是什么问题?
当 websockets 每秒接收大量消息时,是否有可能出现此类问题?我试图从我的本地和 vps 测试这个系统,在这两种情况下我都遇到了同样的问题。这可能是资源问题吗?或者它最有可能与服务器有关,而不是我的客户端?我试图尽可能具体,如果需要,我可以更详细。
我读到websockets 将收到的消息存储在缓冲区中。问题是否可能是缓冲区被填满?
任何形式的建议都值得赞赏!
【问题讨论】:
-
您能提供更多信息吗?所示代码不是minimal reproducible example,它与您的描述不太匹配(没有并发),而且它似乎没有做任何有用的事情(只是打印数据)。确定问题出在
asyncio/websockets而不是您的程序累积数据? -
您好,我将代码编辑为完全可重现;它只打印数据,因为现在它只需要这样做,问题不在于我需要对这些数据做什么,而在于一段时间后它将开始冻结,发送更少的数据和滞后的问题,如果你运行你会注意到同样的
-
我并不是说问题出在 asyncio 或 websockets 上,这意味着它们存在错误,我试图了解这个系统的瓶颈在哪里以及如何解决这个问题。问题很可能与我收到大量消息有关,如果我理解正确,缓冲区将满,这是一个假设
-
如果您在 Linux 上使用许多有用的监控工具,您可以使用
nethogs、top或htop等工具检查您的网络 IO、内存或 CPU 是否饱和。一旦你排除了其中一种饱和,你就可以尝试更深入地挖掘并开始调查 Binance 是否会限制你的速率或诸如此类...... -
我刚刚运行了你的代码,到目前为止我没有任何问题,至少运行了大约 10 分钟。带宽使用率非常低(平均约为 25Kbps),而且 cpu 似乎也很安静(我的旧 2013 macbook pro 上的 cpu 使用率
标签: python python-3.x websocket cryptocurrency