Python使用Binance websocket获取多加密货币交易对价格问题咨询
问题原因
wsapp.run_forever()为阻塞方法,启动第一个交易对的连接后就会卡住循环,无法创建后续两个交易对的连接。- 循环内定义
on_message函数存在闭包延迟绑定问题,即使能启动所有连接,打印的交易对名称也只会是循环最后一个值,无法和对应连接匹配。
解决方案1:使用Binance组合流(推荐)
Binance原生支持单连接订阅多个数据流,无需创建多连接,资源占用低、稳定性高,是官方推荐的多流订阅方式。
import websocket import json cc = ["btcusdt", "adausdt", "solusdt"] interval = "1m" # 拼接所有订阅流 streams = "/".join([f"{symbol}@kline_{interval}" for symbol in cc]) socket = f"wss://stream.binance.com:9443/ws/{streams}" def on_message(ws, message): json_msg = json.loads(message) # 从返回结果中提取当前推送对应的交易对 symbol = json_msg["stream"].split("@")[0] close_price = json_msg["data"]["k"]["c"] print(f"{symbol} : {close_price}") def on_close(ws, close_status_code, close_msg): print("连接已关闭") if __name__ == "__main__": ws = websocket.WebSocketApp(socket, on_message=on_message, on_close=on_close) ws.run_forever()
解决方案2:多线程独立连接
如果需要每个交易对单独维护连接,可以用多线程规避单线程阻塞问题,同时通过参数绑定解决闭包问题:
import websocket import json import threading cc = ["btcusdt", "adausdt", "solusdt"] interval = "1m" def init_websocket(symbol): socket = f'wss://stream.binance.com:9443/ws/{symbol}@kline_{interval}' # 通过默认参数绑定当前交易对,避免闭包取值错误 def on_message(ws, message, cur_symbol=symbol): json_msg = json.loads(message) close_price = json_msg["k"]["c"] print(f"{cur_symbol} : {close_price}") def on_close(ws, close_status_code, close_msg): print(f"{symbol} 连接已关闭") ws = websocket.WebSocketApp(socket, on_message=on_message, on_close=on_close) ws.run_forever() if __name__ == "__main__": thread_list = [] for s in cc: t = threading.Thread(target=init_websocket, args=(s,)) thread_list.append(t) t.start() for t in thread_list: t.join()
内容的提问来源于stack exchange,提问作者Kben59
相关产品推荐
相关产品推荐

