2018-11-14 asyncio報錯

在flask中使用

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

發(fā)現(xiàn)報錯
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

在主線程中,調(diào)用get_event_loop總能返回屬于主線程的event loop對象,如果是處于非主線程中,還需要調(diào)用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參數(shù)設(shè)定為True,flask才會以多線程的方式去處理每一個請求,
否則,所有請求是在一個工作線程(非主線程)運行。具體。此時與直接命令行運行腳本不同,請留意。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 其實 asyncio 的學習一點也不快樂 一、python 的多線程和多進程 要想理解 asyncio 的異步編程...
    寶寶家的隔壁老王閱讀 5,024評論 2 10
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,246評論 0 38
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進程 之前我們已經(jīng)了解了操作系統(tǒng)中進程的概念,程序并不能單獨運行,只有...
    go以恒閱讀 1,795評論 0 6
  • 下午起床后,趁寶寶睡著了,終于把它完成
    溫柔的辣子雞閱讀 80評論 0 0
  • 天空沒有浮云破碎的痕跡 落葉早已遠離春日的樹梢 這世界本無耐味可尋,有了你,有了我,便有了這糾纏不清的話題。這本是...
    東東方閱讀 424評論 0 1

友情鏈接更多精彩內(nèi)容