
本教程详细介绍了如何利用Python的asyncio库和python-binance客户端,构建一个高效、实时的币安(Binance)交易数据流应用程序。文章将涵盖环境设置、异步编程核心概念、代码实现,并特别讨论了在Jupyter Notebook与独立Python脚本文件之间运行异步代码的差异及注意事项,旨在帮助开发者顺利部署实时数据监控系统。
在开始构建实时数据流应用之前,我们需要确保Python环境已正确配置。推荐使用虚拟环境来管理项目依赖,以避免潜在的包冲突。
创建并激活虚拟环境:
python -m venv venv_binance_stream # Windows .\venv_binance_stream\Scripts\activate # macOS/Linux source venv_binance_stream/bin/activate
安装所需库: 本教程主要依赖python-binance和nest_asyncio。nest_asyncio在某些交互式环境中(如Jupyter)运行异步代码时非常有用。
pip install python-binance==1.0.19 nest_asyncio==1.5.8
请注意,这里指定了与成功案例中相同的版本,以确保兼容性。
立即学习“Python免费学习笔记(深入)”;
理解以下几个核心概念对于构建异步数据流至关重要:
我们将构建一个脚本,连接到币安的WebSocket API,实时接收BTC/USDT的交易数据。
import asyncio
import nest_asyncio
import sys
import logging
from binance.client import Client
from binance import BinanceSocketManager
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def run_binance_stream():
"""
设置并运行币安实时交易数据流。
"""
# 在Jupyter等环境中,如果已存在事件循环,需要应用nest_asyncio
# 对于独立的.py脚本,通常不是必需的,但保留可确保兼容性
if sys.platform == 'win32': # Windows系统可能需要特殊处理
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
nest_asyncio.apply()
async def main():
"""
异步主函数,负责连接WebSocket并接收数据。
"""
# 初始化Binance客户端。此处无需API Key,因为WebSocket公共数据不需要认证。
client = Client()
# 初始化Binance Socket管理器
bsm = BinanceSocketManager(client)
# 订阅BTCUSDT交易数据流
socket = bsm.trade_socket('BTCUSDT')
logging.info("正在连接到Binance WebSocket...")
try:
async with socket as ts:
while True:
try:
logging.info('等待数据...')
msg = await ts.recv() # 异步等待接收数据
logging.info(msg) # 打印接收到的交易消息
except asyncio.CancelledError:
logging.info("数据流已取消。")
break
except Exception as e:
logging.error(f"接收数据时发生错误: {e}")
await asyncio.sleep(5) # 发生错误后等待一段时间重试
finally:
# 确保客户端连接被关闭,释放资源
await client.close_connection()
logging.info("Binance客户端连接已关闭。")
# 运行异步主函数
# asyncio.run() 会自动创建并管理事件循环
try:
asyncio.run(main())
except KeyboardInterrupt:
logging.info("程序被用户中断。")
except RuntimeError as e:
logging.error(f"运行时错误: {e}. 可能是事件循环问题。")
finally:
logging.info("数据流程序已退出。")
if __name__ == '__main__':
run_binance_stream()
代码解析:
原始问题中提到代码在Jupyter Notebook中运行正常,但在.py文件中却不工作。这通常是由于异步环境的差异造成的:
为什么原始脚本在.py中可能不工作?
尽管代码在理论上应该在.py文件中正常运行,但出现问题可能的原因包括:
通过上述提供的完整代码,我们包含了更健壮的错误处理和对Windows平台事件循环策略的适应,这有助于提高在不同环境下的兼容性和稳定性。
以上就是Python异步编程实践:使用Binance API构建实时交易数据流的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号