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 ccxt
import 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/
作者
晨平安
发布于
2026-02-05
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00