M1 Pro Mac无法运行Binance WebSocket交易代码,Intel平台正常,求解决
M1 Pro Mac上Binance WebSocket订单簿策略代码卡住无输出的排查方案
架构兼容性排查
- 先确认Python环境是原生ARM64:运行
python -c "import platform; print(platform.machine())",输出应为arm64。如果是x86_64,说明用的是Rosetta转译版本,建议替换为官网或brew安装的原生ARM64 Python,部分网络库在转译环境下会出现线程阻塞问题。 - 强制重装ARM64版本的依赖库:执行
ARCHFLAGS="-arch arm64" pip install --force-reinstall websocket-client python-binance,确保依赖是适配ARM架构的。
线程同步问题修正
- 别乱用
threading.Lock():如果你是用锁来同步process_message(WebSocket回调线程)和analyze_data(主线程/分析线程)的数据流,直接换成queue.Queue更稳妥——队列本身是线程安全的,不需要额外加锁,能避免锁顺序错误导致的死锁。 - 检查锁的使用场景:如果必须用锁,绝对不要在锁内执行耗时操作(比如复杂计算、IO请求),WebSocket回调线程被阻塞会导致消息堆积,最终整个程序卡住。
多线程调试技巧(绕过VSCode主线程限制)
- 加详细线程日志:在关键函数里埋日志,比如:
运行后看日志输出,就能知道各个线程有没有正常执行,卡在了哪个环节。import logging import threading logging.basicConfig(level=logging.INFO, format="[%(thread)d] %(message)s") def process_message(msg): logging.info("Received WebSocket message") # 后续逻辑 def analyze_data(data): logging.info("Start analyzing orderbook data") # 后续逻辑 - 用
py-spy做栈分析:安装brew install py-spy,启动程序后用py-spy top --pid <你的Python进程ID>,能实时看到所有线程的调用栈,直接定位卡住的函数或等待锁的位置。
WebSocket连接优化
- 配置心跳参数:创建Binance WebSocket客户端时,手动指定心跳间隔和超时,避免连接假死:
from binance.websockets import BinanceSocketManager bm = BinanceSocketManager(client, ping_interval=30, ping_timeout=10) - 开启调试日志:打开Binance客户端的DEBUG日志,查看WebSocket连接和消息收发细节:
import logging client.logger.setLevel(logging.DEBUG)
内容的提问来源于stack exchange,提问作者Angela
相关产品推荐
相关产品推荐

