.stop() 上的 Tornado Web 服务器 ioloop 错误
Tornado web server ioloop error on .stop()
我在 tornado 上构建了网络服务器。以下是主要 WebServer 的一些部分 class:
import tornado.ioloop as tio
...
class WebServer(object):
def __init__(.....):
...
self.IOloop = tio.IOLoop.instance()
...
def __call__(self):
self.logger('info', 'Web server', 'Starting web server on port %s, waiting for connection...' % (self.port))
if self.verbose:
print 'Starting web server on port %s, waiting for connection...' % (self.port)
try:
self.application.listen(self.port)
self.IOloop.start()
except Exception as error:
self.logger('error', 'Web server', str(error), exc_info = True)
self.stop()
if self.verbose:
print 'Web server shut down'
self.logger('info', 'Web server', 'Stopped')
def stop(self):
if self.up:
self.logger('info', 'Web server', 'Shutting down...')
ioloop = tio.IOLoop.current()
ioloop.stop()
ioloop.close()
self.ws_controller.stop()
self.ws_thread.join()
self.up = False
Server 实例是众多后端对象之一 运行。我在单独的线程中启动服务器实例以及其他后端对象:
def assign_component(self, name, config_name, class_):
self.components[name] = class_(bus = self.bus, logger = self.logger, config = self.config[config_name], verbose = self.verbose)
setattr(self, name, self.components[name])
self.threads[name] = thr.Thread(target = self.components[name])
self.threads[name].start()
在这种情况下,class_
是 WebServer。
它的工作没有问题。但是当我想停止整个应用程序时,我遇到了以下错误:
ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
File "/root/anaconda2/lib/python2.7/site-packages/tornado/ioloop.py", line 865, in start
fd_obj, handler_func = self._handlers[fd]
KeyError: 29
我通读了很多文章,它们讲述了线程不安全和 add_callback,但我不明白如果我只想启动和停止 IOloop 的主实例,为什么我需要一些回调?我在理解龙卷风 IOloop 时缺少什么?
IOLoop 中唯一线程安全的方法是add_callback。您可以使用它来停止 IOLoop。但是,未经测试,它类似于:
...
def stop(self):
if self.up:
self.logger('info', 'Web server', 'Shutting down...')
self.IOLoop.add_callback(lambda x: x.stop(), self.IOLoop)
self.ws_controller.stop()
self.ws_thread.join()
self.up = False
一些相关问题:How do I stop Tornado web server?
P.S。提供minimum working example.
是个好习惯
我在 tornado 上构建了网络服务器。以下是主要 WebServer 的一些部分 class:
import tornado.ioloop as tio
...
class WebServer(object):
def __init__(.....):
...
self.IOloop = tio.IOLoop.instance()
...
def __call__(self):
self.logger('info', 'Web server', 'Starting web server on port %s, waiting for connection...' % (self.port))
if self.verbose:
print 'Starting web server on port %s, waiting for connection...' % (self.port)
try:
self.application.listen(self.port)
self.IOloop.start()
except Exception as error:
self.logger('error', 'Web server', str(error), exc_info = True)
self.stop()
if self.verbose:
print 'Web server shut down'
self.logger('info', 'Web server', 'Stopped')
def stop(self):
if self.up:
self.logger('info', 'Web server', 'Shutting down...')
ioloop = tio.IOLoop.current()
ioloop.stop()
ioloop.close()
self.ws_controller.stop()
self.ws_thread.join()
self.up = False
Server 实例是众多后端对象之一 运行。我在单独的线程中启动服务器实例以及其他后端对象:
def assign_component(self, name, config_name, class_):
self.components[name] = class_(bus = self.bus, logger = self.logger, config = self.config[config_name], verbose = self.verbose)
setattr(self, name, self.components[name])
self.threads[name] = thr.Thread(target = self.components[name])
self.threads[name].start()
在这种情况下,class_
是 WebServer。
它的工作没有问题。但是当我想停止整个应用程序时,我遇到了以下错误:
ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
File "/root/anaconda2/lib/python2.7/site-packages/tornado/ioloop.py", line 865, in start
fd_obj, handler_func = self._handlers[fd]
KeyError: 29
我通读了很多文章,它们讲述了线程不安全和 add_callback,但我不明白如果我只想启动和停止 IOloop 的主实例,为什么我需要一些回调?我在理解龙卷风 IOloop 时缺少什么?
IOLoop 中唯一线程安全的方法是add_callback。您可以使用它来停止 IOLoop。但是,未经测试,它类似于:
...
def stop(self):
if self.up:
self.logger('info', 'Web server', 'Shutting down...')
self.IOLoop.add_callback(lambda x: x.stop(), self.IOLoop)
self.ws_controller.stop()
self.ws_thread.join()
self.up = False
一些相关问题:How do I stop Tornado web server?
P.S。提供minimum working example.
是个好习惯