433 字
2 分钟
Python 并发之战:AsyncIO vs Threading 在量化交易中的选择
毫秒必争的战场
在写交易机器人时,我们经常面临一个选择:是用多线程 (threading) 还是 协程 (asyncio)?
对于高频或准高频策略,我的答案是:AsyncIO 是唯一的真神。
GIL 的诅咒
Python 的全局解释器锁 (GIL) 让多线程在 CPU 密集型任务上形同虚设。虽然在 IO 密集型(比如网络请求)上,多线程能通过切换上下文来提高效率,但线程切换本身的开销(Context Switch)在毫秒级的竞争中也是累赘。
AsyncIO 的降维打击
asyncio 是 单线程 的。它没有线程切换的开销。它依靠 事件循环 (Event Loop) 来调度任务。
当你的代码执行 await exchange.fetch_ticker() 时,它不是在傻等网络返回,而是立刻把 CPU 控制权交还给事件循环:“大哥,我去发个请求,你先处理别的,回头好了叫我。”
这意味着,在同一个 CPU 核心上,你可以同时挂起成百上千个网络请求。
CCXT 的 pro 模式
著名的量化库 ccxt 有一个 ccxt.pro 版本(或者启用 async 模式)。
import ccxt.async_support as ccxtimport asyncio
async def main(): exchange = ccxt.binance() # 同时获取三个币种的价格,并发执行! tickers = await asyncio.gather( exchange.fetch_ticker('BTC/USDT'), exchange.fetch_ticker('ETH/USDT'), exchange.fetch_ticker('SOL/USDT') ) print(tickers) await exchange.close()
asyncio.run(main())如果是多线程,这三个请求是串行的(或者并发但有切换成本)。而在 AsyncIO 下,它们几乎是同时发出的。
结论
如果你的策略需要监控几十个币种,或者需要极低延迟的 websocket 推送,请务必学习 async/await。虽然代码逻辑变复杂了,但那种丝滑的并发快感,会让你的机器人快人一步。
Python 并发之战:AsyncIO vs Threading 在量化交易中的选择
https://www.oferry.com/posts/a33/