2018-11-14 asyncio报错

在flask中使用

import asyncio
.....
 loop = asyncio.get_event_loop()
....

发现报错
RuntimeError: There is no current event loop in thread 'Thread-2'.

修改为

import asyncio
...
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
loop = asyncio.get_event_loop()

原因:

# 源码
def get_event_loop(self):
    """Get the event loop.
    This may be None or an instance of EventLoop.
    """
    if (self._local._loop is None and
            not self._local._set_called and
            isinstance(threading.current_thread(), threading._MainThread)):
        self.set_event_loop(self.new_event_loop())

    if self._local._loop is None:
        raise RuntimeError('There is no current event loop in thread %r.'
                            % threading.current_thread().name)

    return self._local._loop

在主线程中,调用get_event_loop总能返回属于主线程的event loop对象,如果是处于非主线程中,还需要调用set_event_loop方法指定一个event loop对象,这样get_event_loop才会获取到被标记的event loop对象:

def set_event_loop(self, loop):
    """Set the event loop."""
    self._local._set_called = True
    assert loop is None or isinstance(loop, AbstractEventLoop)
    self._local._loop = loop

参考
由于Flask工作流程:
如果启动app时将threaded参数设定为True,flask才会以多线程的方式去处理每一个请求,
否则,所有请求是在一个工作线程(非主线程)运行。具体。此时与直接命令行运行脚本不同,请留意。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 其实 asyncio 的学习一点也不快乐 一、python 的多线程和多进程 要想理解 asyncio 的异步编程...
    宝宝家的隔壁老王阅读 10,365评论 2 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,759评论 0 38
  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 5,639评论 0 6
  • 下午起床后,趁宝宝睡着了,终于把它完成
    温柔的辣子鸡阅读 694评论 0 0
  • 天空没有浮云破碎的痕迹 落叶早已远离春日的树梢 这世界本无耐味可寻,有了你,有了我,便有了这纠缠不清的话题。这本是...
    东东方阅读 3,017评论 0 1

友情链接更多精彩内容