133 浏览
0

程序主体是协程代码,现在想要达到一种效果,例如下:
if a>b:
print(‘退出程序,’)
api.close()

但像这样写会报错,那 api.close() 应该写在哪里?或者,有没有其它的方法,也能正常退出程序?

chaos 已回答的问题 3天 前
1

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 发表新评论 3天 前

有其他问题欢迎加入官方Q群748265037一起交流

有效,非常感谢!