为什么 ctrl + c 不停止 tornado 服务器? [英] Why does ctrl + c not stop tornado server?

查看:32
本文介绍了为什么 ctrl + c 不停止 tornado 服务器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么 ctrl + c 不停止 windows 上的 Tornado 服务器?

Why does ctrl + c not stop tornado server on windows ?

这段代码没有被执行:print 'get sig:%d' % signum

import signal

import tornado
import tornado.web
import tornado.httpserver


class DefaultHandler(tornado.web.RequestHandler):

    def get(self):
        self.set_status(200, 'OK')
        self.write('hello guest')

    def post(self):
        self.get()


class Receiver(object):

    def __init__(self, address=None, port=8100, gzip=False):

        if not address:
            address = '0.0.0.0'
        self.address = address
        self.port = port
        self.gzip = gzip
        self.http_server = None

    def start(self):
        settings = dict(
        )
        application = tornado.web.Application([
            (r"/", DefaultHandler),],
            **settings)
        self.http_server = tornado.httpserver.HTTPServer(application, decompress_request=self.gzip)
        self.http_server.listen(self.port)
        tornado.ioloop.IOLoop.instance().start()

    def shutdown(self):

        if self.http_server is not None:
            self.http_server.stop()
        tornado.ioloop.IOLoop.instance().stop()


if __name__ == '__main__':
    receiver = Receiver(port=8901)

    def sig_handler(signum, frame):
        print 'get sig:%d' % signum
        receiver.shutdown()


    signal.signal(signal.SIGTERM, sig_handler)
    signal.signal(signal.SIGINT, sig_handler)
    receiver.start()

我的解决方案:

只有主线程可以处理信号,所以使用线程来启动接收器,让主线程做一些虚假的工作来保持活动

threading.Thread(target=receiver.start).start()
while 1:
    try:
        time.sleep(2)
    except:
        break

推荐答案

信号处理程序是一种特殊的环境.你必须小心你在一个中做什么,因为你不知道被信号中断的函数的状态.在 Tornado 中,只有 一个 函数可以保证安全地从信号处理程序内部调用:IOLoop.add_callback_from_signal.不要直接调用 shutdown(),而是使用 add_callback_from_signal 来调度它:

Signal handlers are a special environment. You have to be careful what you do in one because you don't know the state of the functions that were interrupted by the signal. In tornado, only one function is guaranteed safe to call from inside a signal handler: IOLoop.add_callback_from_signal. Instead of calling shutdown() directly, use add_callback_from_signal to schedule it:

def sig_handler(signum, frame):
    IOLoop.current().add_callback_from_signal(receiver.shutdown)

这篇关于为什么 ctrl + c 不停止 tornado 服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆