Tornado IOLoop бесконечно пробуждается EPOLLOUT, потребляя 100% загрузки процессора
Я использую tornado 4.4.1
в Ubuntu 14.xx
за Websocket
а также HTTP
сервер.
Я пробежал пару дней.
Тем временем я обнаружил, что поток IoLoop занимает 100% загрузки процессора.
Я проверяю, какое действие делает поток, хотя strace -p IoLoopthreadId
,
След говорит, что IoLoop
пробуждается бесконечно от epoll_wait
от EPOLLOUT
,
Я просто использую ioloop.IOLoop.instance().start()
производить IoLoop
Нить.
Что может сделать эта ситуация?
Как я могу решить это?
Пожалуйста, дайте мне какие-либо предложения.
------------------РЕДАКТИРОВАТЬ---------------------
Ниже приведена часть кода, касающаяся Торнадо.
Кроме того, что, если конечная точка (websocket) не находится в состоянии ответа, поддерживающем соединение, в то время как торнадо пытается отправить сообщение, возможно, это создает проблему?
class ConvPlayerInterface(object):
logger = logging.getLogger("Player.PlayerInterface")
queue = ipcQueue.IpcQueue(maxsize=50)
class WebsocketHandler(websocket.WebSocketHandler):
client = []
def open(self):
ConvPlayerInterface.logger.info('PlayerInterface is Opened')
self.client.append(self) #It consider that only one client is handled.
def on_message(self, message):
ConvPlayerInterface.logger.info("Receive PlayerInterface Message : %s" % message)
ConvPlayerInterface.queue.put(message)
def on_close(self):
ConvPlayerInterface.logger.info('PlayerInterface is closed')
self.client.remove(self)
def check_origin(self, origin):
return True
def get(self):
jsonStr = self.queue.get()
return json.loads(jsonStr)
def getAll(self):
jsonStrList = self.queue.getAll()
jsonObjList = [json.loads(_jsonStr) for _jsonStr in jsonStrList]
return jsonObjList
def put(self, command):
for client in self.WebsocketHandler.client:
client.write_message(command)
ConvPlayerInterface.logger.info('Emitted PlayerInterface Message : %s' % command)
def execute(self, command, rtnCmd):
pass
class TornadoManager(threading.Thread):
def __init__(self, location):
threading.Thread.__init__(self)
_djangoWsgi = djangoWsgi.get_wsgi_application()
self.tornadoWsgiContainer= tornadoWsgi.WSGIContainer(_djangoWsgi)
self.ip, self.port = location.split(":")
self.tornadoApp = web.Application([
(r"/list/socket", playerInterface.ConvPlayerInterface.WebsocketHandler),
(r'/static/(.*)', web.StaticFileHandler, {'path': os.path.join(os.path.dirname(__file__), "static")}),
(r".*", web.FallbackHandler, dict(fallback=self.tornadoWsgiContainer)),
], debug=False
)
self.server = httpserver.HTTPServer(self.tornadoApp)
self.server.listen(self.port, self.ip)
def run(self):
print "Start Tornado IOLoop - %s:%s" % (self.ip, self.port)
ioloop.IOLoop.instance().start()