簡體   English   中英

RuntimeError: 線程 'Thread-1' 中沒有當前事件循環,多線程和異步錯誤

[英]RuntimeError: There is no current event loop in thread 'Thread-1' , multithreading and asyncio error

我有一個調用 asyncio 循環的線程,但這會導致上述異常:

RuntimeError: There is no current event loop in thread 'Thread-1'.

這個問題: RuntimeError: there is no current event loop in thread in async + apscheduler遇到了同樣的問題,但是他們指的是我沒有的調度程序。

我的代碼如下:

def worker(ws):
      l1 = asyncio.get_event_loop()
      l1.run_until_complete(ws.start())  


      l2 = asyncio.get_event_loop()
      l2.run_forever()


if __name__ == '__main__':
    ws = Server()
    p = threading.Thread(target=worker,args=(ws,))
    p.start()


    while True:
        try:
            #...do sth
        except KeyboardInterrupt:
            p.join()
            exit() 

新線程沒有事件循環,因此您必須明確傳遞並設置它:

def worker(ws, loop):
    asyncio.set_event_loop(loop)
    loop.run_until_complete(ws.start())

if __name__ == '__main__':
    ws = Server()
    loop = asyncio.new_event_loop()
    p = threading.Thread(target=worker, args=(ws, loop,))
    p.start()

此外, p.join()不會正確終止您的腳本,因為您永遠不會停止服務器,因此您的循環將繼續運行,大概會掛斷線程。 在加入線程之前,您應該像loop.call_soon_threadsafe(ws.shutdown)一樣調用 smth,理想情況下等待服務器的正常關閉。

我在線程中運行 Bokeh 服務器時遇到了這個問題。 當我嘗試創建 server = Server({'/': app}, port=0) 時,我會收到此錯誤。 從 Tornado 文檔中,我發現了以下內容...

Class tornado.platform.asyncio.AnyThreadEventLoopPolicy[source]

允許在任何線程上創建循環的事件循環策略。 默認的 asyncio 事件循環策略僅在主線程中自動創建事件循環。 其他線程必須顯式創建事件循環,否則 asyncio.get_event_loop(因此 IOLoop.current)將失敗。 安裝此策略允許在任何線程上自動創建事件循環,匹配 Tornado 5.0(或 Python 2 上的 5.0)之前版本的行為。

用法:

asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())

http://www.tornadoweb.org/en/stable/asyncio.html#tornado.platform.asyncio.AnyThreadEventLoopPolicy

在使用 Python 3.7.3 的 Windows 上,不是直接在線程中創建事件循環,

我必須:

asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

否則,問題會一直存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM