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()

0 ответов

Другие вопросы по тегам