最近在使用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): |
推荐阅读: