簡體   English   中英

python3.6 在多線程中使用 tornado 時發生錯誤

[英]Error happen python3.6 while using tornado in multi threading

我只是簡單地將 tornado 應用程序與線程一起使用,如下代碼所示:

def MakeApp():
    return tornado.web.Application([(r"/websocket", EchoWebSocket), ])

def run_tornado_websocket():
    app = MakeApp()
    http_server = tornado.httpserver.HTTPServer(app, ssl_options={
        "certfile": os.path.join(os.path.abspath("."), "server.crt"),
        "keyfile": os.path.join(os.path.abspath("."), "server_no_passwd.key"),
        })

    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

if __name__ == '__main__':
    threads = []
    t = threading.Thread(target=run_tornado_websocket, args=())
    threads.append(t)
    for t in threads:
        t.start()

它在 python3.5 上工作正常。但它在 python3.6 和持續的龍卷風上失敗。它得到錯誤:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\python3\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
  File "D:\python3\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "D:\ssl\ws_server.py", line 49, in run_tornado_websocket
    http_server.listen(options.port)
  File "D:\python3\lib\site-packages\tornado\tcpserver.py", line 145, in listen
    self.add_sockets(sockets)
  File "D:\python3\lib\site-packages\tornado\tcpserver.py", line 159, in add_sockets
    sock, self._handle_connection)
  File "D:\python3\lib\site-packages\tornado\netutil.py", line 219, in add_accept_handler
    io_loop = IOLoop.current()
  File "D:\python3\lib\site-packages\tornado\ioloop.py", line 282, in current
    loop = asyncio.get_event_loop()
  File "D:\python3\lib\asyncio\events.py", line 694, in get_event_loop
    return get_event_loop_policy().get_event_loop()
  File "D:\python3\lib\asyncio\events.py", line 602, in get_event_loop
% threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'Thread-1'.

我認為python3.6中的IOLOOP有一些變化。但我不知道如何解決這個問題,很想知道原因。

從 Tornado 5.0 開始,默認使用asyncio事件循環。 asyncio有一些額外的限制,因為在主線程以外的線程上啟動事件循環是一種不常見的模式,而且經常是一個錯誤。 您必須通過asyncio.set_event_loop(asyncio.new_event_loop())告訴 asyncio 您想在新線程中使用事件循環,或使用asyncio.set_event_loop_policy(tornado.platform.asyncio.AnyThreadEventLoopPolicy())禁用此限制。

暫無
暫無

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

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