3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT(迅投量化交易系统)中,策略的生命周期主要由三个核心函数控制:init()、handlebar() 以及 stop()。当策略在运行过程中创建了自定义多线程、Socket 网络连接或打开了文件句柄等资源时,如果不及时清理,可能导致策略停止后后台线程泄漏、资源占用过高甚至程序崩溃。
stop(ContextInfo) 是 QMT 策略模型在关闭或停止运行前调用的回调函数。
以下示例演示如何在 init 中启动一个后台守护线程,并在策略停止时利用 stop() 正确优雅地终止该线程并释放资源:
#coding:gbk
import threading
import time
# 定义一个标志位通知线程退出
running = True
background_thread = None
def my_worker():
global running
print("后台线程启动...")
while running:
# 模拟后台定时任务或数据处理
time.sleep(1)
print("后台线程安全退出。")
def init(ContextInfo):
global running, background_thread
running = True
print("策略初始化...")
# 启动自定义多线程
background_thread = threading.Thread(target=my_worker)
background_thread.start()
def handlebar(ContextInfo):
# 策略主逻辑
pass
def stop(ContextInfo):
global running, background_thread
print("检测到策略停止,开始清理资源...")
# 1. 改变运行标志位,通知后台线程停止循环
running = False
# 2. 等待线程结束
if background_thread and background_thread.is_alive():
background_thread.join(timeout=3)
print("资源清理完成,策略顺利停止!")
stop() 函数在策略退出时被调用,不要在 stop() 中执行耗时极长的阻塞操作。建议使用带超时控制的 thread.join(timeout=N)。try...except 容错,防止清理过程中的异常导致程序崩溃。threading.Lock 锁保证数据安全与同步。