程序主体是协程代码,现在想要达到一种效果,例如下:
if a>b:
print(‘退出程序,’)
api.close()
但像这样写会报错,那 api.close() 应该写在哪里?或者,有没有其它的方法,也能正常退出程序?
chaos 已回答的问题 2026年5月26日
api.close() 不能直接在协程里调用。TqSdk 的协程任务是由外层 api.wait_update() 推进的,协程正在运行时调用 api.close() 会报“不能在协程中调用 close”这一类错误。
处理方式是:协程里只负责 return 结束任务,真正的 api.close() 放在外层 wait_update() 循环退出后的 finally 里。
下面是一个可以直接按结构运行的例子,退出条件这里用“拿到最新价后退出”演示,实际使用时把 if quote.last_price == quote.last_price: 换成你自己的退出条件即可:
<code>from tqsdk import TqApi, TqAuth
api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("KQ.m@SHFE.au")
async def main():
async with api.register_update_notify(quote) as update_chan:
async for _ in update_chan:
if quote.last_price == quote.last_price:
print("退出程序")
return
task = api.create_task(main())
try:
while not task.done():
api.wait_update()
task.result()
finally:
api.close()</code>
核心点是:不要在 async def 里面直接 api.close();让协程退出,回到外层主循环后统一关闭 api。
happiness 发表新评论 2026年5月26日
有效,非常感谢!
有其他问题欢迎加入官方Q群748265037一起交流