在使用python执行定时任务的时候,会用到asyncio.get_event_loop()函数,常用以下用法:
loop = asyncio.get_event_loop()
loop.run_until_complete(handle_ecs_gc_task())
loop.close()
如果用以上用法,在使用while True去做循环的时候,就会报错以下的错误:
Event loop is closed
原因在于get_event_loop是个全局变量,在同一个循环中关掉之后,就一直是关闭状态了(没找到怎么重新打开的方法,官方源代码的close说的是colse之后不能再调用任何方法---
),关闭之后,run_until_complete调用就会报出上面的错
最直接的解决办法就是在循环里不调用loop.close(),或者把close放在while true外面,也就是只关一次
但是如果loop里面的函数还涉及到数据库锁的问题,不调用close会引入新问题。
所以为了解决上面的问题,可以通过一个间接途径:
把需要定时执行的函数(while true)放入test1.py,把包含loop的函数放入另一个文件test2.py,然后while true去定时的执行test2文件,这样相当于每次执行的时候,都是一个新的event_loop,不会再报错。
循环里强制退出可以用os._exit(0)