问题描述
为什么 不停止 windows 上的 Tornado 服务器?
Why does 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 服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!