Не удается остановить веб-сервер с момента обновления до последней версии ОС - PullRequest
0 голосов
/ 15 января 2019

Я разбил свою программу на простой 60-линейный режим, который должен запускать и останавливать сервер Tornado через 2 секунды.Этот фрагмент кода работал с более ранней версией Debian, но он зависает и не останавливается на текущей версии:

> uname -a
Linux xyz 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux

import time
import threading
import logging
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocket

class HTTPHandler(tornado.web.RequestHandler):
    """HTTP request handler for my simplyfied web-server."""

    def initialize(self):
        pass

    def get(self):
        """Execute HTTP GET commands."""
        self.set_status(200)
        self.set_header('Content-type', "text/html; charset=utf-8")
        self.write("HI")

class WebServer(threading.Thread):

    def __init__(self):
        """Setup web-server on a configured port."""
        threading.Thread.__init__(self)
        self.port = 4030

    def run(self):
        """Start listening on port as a web-server."""
        application = tornado.web.Application([(r"/.*", HTTPHandler)])
        httpd = tornado.httpserver.HTTPServer(application)
        interface, ip = ("eth0", "192.168.2.4")
        httpd.listen(self.port, address=ip)
        logging.info("WebServer Starts - %s(%s):%s", ip, interface, self.port)
        log = logging.getLogger("tornado.access")
        log.setLevel(logging.NOTSET)

        tornado.ioloop.IOLoop.instance().start()

        logging.info("WebServer exiting")

    def stop(self):
        """Set shutdown flag for the thread to stop."""
        tornado.ioloop.IOLoop.instance().stop()

if __name__ == '__main__':
    rootLogger = logging.getLogger('')
    rootLogger.setLevel(logging.DEBUG)
    logging.getLogger("tornado.general").setLevel(logging.NOTSET)
    logging.getLogger("tornado.application").setLevel(logging.NOTSET)
    logging.getLogger("tornado.access").setLevel(logging.NOTSET)

    ws = WebServer()
    ws.start()

    time.sleep(2.0)
    logging.debug("Stopping")
    ws.stop()

Если честно, я не могу вспомнить, какая была предыдущая версия ОС, но это было в-линейшая версия годаЕсть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 21 января 2019

Вы звоните IOLoop.instance().stop() из основного потока, что запрещено. Метод only в Tornado, который безопасно вызывать из потока, отличного от того, в котором запущен IOLoop, - IOLoop.add_callback. Чтобы инициировать отключение из основного потока, когда IOLoop работает в другом потоке, замените метод stop следующим:

def stop(self):
    """Instruct the IOLoop to stop itself."""
    IOLoop.instance().add_callback(IOLoop.instance().stop)
...