最近在使用APScheduler的时候发生了一个报错:RuntimeError:There is no current event loop in thread。仔细研究和查阅之后发现是调用方式有问题。
看下别人的问答:RuntimeError: There is no current event loop in thread in async + apscheduler
1 | URL_LIST = ['<url1>', |
因为我们是和asyncio一起使用的,我们看下AsyncIOExecutor的注释:
1 | class AsyncIOExecutor(BaseExecutor): |
即当我们添加job的时候,如果是协程函数将会在主线程中执行(主线程中存在loop),而当我们的job不是
协程函数的时候,将会使用线程池或者进程池去处理(新的线程或者进程中是没有loop的)。
解决办法:如果你添加的job必须是同步函数,而同步函数中需要使用event_loop那么你需要按照下面方式重新设置一下新的event_loop。
1 | loop = asyncio.new_event_loop() |
根本原因在源码中:
1 | def get_event_loop(self): |
在主线程中,调用get_event_loop总能返回属于主线程的event loop对象,如果是处于非主线程中,还需要调用set_event_loop方法指定一个event loop对象,这样get_event_loop才会获取到被标记的event loop对象:
1 | def set_event_loop(self, loop): |
推荐阅读: