Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多线程中使用tornado时发生python3.6错误_Python_Tornado_Python Multithreading - Fatal编程技术网

在多线程中使用tornado时发生python3.6错误

在多线程中使用tornado时发生python3.6错误,python,tornado,python-multithreading,Python,Tornado,Python Multithreading,我只是简单地将tornado应用程序与线程一起使用,如下代码所示: def MakeApp(): return tornado.web.Application([(r"/websocket", EchoWebSocket), ]) def run_tornado_websocket(): app = MakeApp() http_server = tornado.httpserver.HTTPServer(app, ssl_options={ "cert

我只是简单地将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和持续的tornado上失败。它得到错误:

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您想在新线程中使用事件循环,方法是
asyncio.set\u event\u loop(asyncio.new\u event\u loop())
,或者使用
asyncio.set\u event\u loop\u policy(tornado.platform.asyncio.AnyThreadEventLoopPolicy())
禁用此限制

在python3.5上运行良好——在python3.5.4和tornado 5.0.2上检查,同样的错误。另外,为什么您需要在非主线程中启动tornado?如果我使用
AnyThreadEventLoopPolicy()
我会得到一个
AssertionError:assert循环为None或isinstance(循环,AbstractEventLoop)
-请参见此处