3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)量化平台中,所有的策略代码(包括 run_daily、run_weekly、run_monthly 等定时函数以及 handle_data)都是严格串行(单线程)执行的。
因此,不会出现 funcA 没执行完就开始运行 funcB 的情况。你不需要为了防止它们“并行冲突”而刻意预留时间间隔。
聚宽的策略引擎在底层是单线程运行的(出于安全和资源隔离的考虑,平台禁用了多进程/多线程模式)。当你在策略中设定了多个定时任务时,引擎会维护一个时间事件队列:
9:35,引擎触发并开始执行 funcA。funcA 计算非常复杂,耗时了 2 分钟(即真实时间到了 9:37 才执行完毕)。funcA 后,检查事件队列,发现 9:36 的 funcB 已经错过了触发时间,于是会立即开始执行 funcB。结论:funcB 会被阻塞,直到 funcA 完全执行结束才会启动。它们绝对不会同时运行,也不会导致变量读写冲突。
虽然不用担心并行冲突,但长耗时的函数依然会带来其他负面影响,需要引起注意:
funcA 耗时过长,导致 funcB 延迟到 9:37 才执行,那么 funcB 中生成的交易信号和订单也会延迟发出。在早盘波动剧烈的时间段,这可能会导致严重的滑点。funcA 极端卡顿超过 30 分钟,整个策略进程会被系统强制杀死(抛出 TimeoutError)。handle_tick),在 funcA 阻塞的这 1 分钟内,引擎无法处理新的 Tick 事件,可能会导致这期间的 Tick 逻辑被跳过。为了避免早盘服务器负载大导致的严重延迟,建议采取以下优化措施:
funcA 主要是进行数据准备、选股、复杂指标计算,且不需要用到 9:30 - 9:35 的盘中数据,强烈建议将其移到盘前执行(例如使用 before_trading_start 或 run_daily(funcA, '09:00'))。for 循环遍历 DataFrame。get_price、history 等数据 API,应该一次性批量获取所需数据。enable_profile(),找出代码中的耗时瓶颈进行针对性优化。funcA 和 funcB 都有下单逻辑,且对时间敏感,尽量精简这两个函数,或者将非紧急的计算逻辑延后到盘后(after_trading_end)处理。