You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:48:02