首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用ctrl+c停止tornado web服务器?

如何使用ctrl+c停止tornado web服务器?
EN

Stack Overflow用户
提问于 2013-06-14 13:11:55
回答 3查看 13.1K关注 0票数 15

我是tornado web服务器的新手。当我使用python main_tornado.py启动tornado web服务器时,它正在工作。请看下面的代码。

代码语言:javascript
复制
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

当我使用CTRL+C停止服务器时,它给出了以下错误。

代码语言:javascript
复制
    ^CTraceback (most recent call last):
  File "main_tornado.py", line 19, in <module>
    tornado.ioloop.IOLoop.instance().start()
  File "/home/nyros/Desktop/NewWeb/venv/lib/python3.2/site-packages/tornado/ioloop.py", line 301, in start
    event_pairs = self._impl.poll(poll_timeout)
KeyboardInterrupt

请帮我解决问题。谢谢..

EN

回答 3

Stack Overflow用户

发布于 2017-05-13 08:11:07

您可以简单地从信号处理程序停止Tornado ioloop。它应该是安全的,这要归功于add_callback_from_signal()方法,事件循环将很好地退出,完成任何最终并发运行的任务。

代码语言:javascript
复制
import tornado.ioloop
import tornado.web
import signal

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

def sig_exit(signum, frame):
    tornado.ioloop.IOLoop.instance().add_callback_from_signal(do_stop)

def do_stop(signum, frame):
    tornado.ioloop.IOLoop.instance().stop()

if __name__ == "__main__":
    application.listen(8888)
    signal.signal(signal.SIGINT, sig_exit)
    tornado.ioloop.IOLoop.instance().start()
票数 8
EN

Stack Overflow用户

发布于 2013-06-15 01:27:44

代码是正常的。CTRL+C生成KeyboardInterrupt。要停止服务器,可以使用CTRL+Pause Break(在windows上)而不是CTRL+C。在linux上,CTRL+C也会生成KeyboardInterrupt。如果您将使用CTRL+Z程序将停止,但端口变得繁忙。

票数 3
EN

Stack Overflow用户

发布于 2018-07-27 07:39:59

我想说,最干净、最安全、最便携的解决方案是将所有的关闭和清理调用放在一个finally块中,而不是依赖于KeyboardInterrupt exception:

代码语言:javascript
复制
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

# .instance() is deprecated in Tornado 5
loop = tornado.ioloop.IOLoop.current()

if __name__ == "__main__":
    try:
        print("Starting server")
        application.listen(8888)
        loop.start()
    except KeyboardInterrupt:
        pass
    finally:
        loop.stop()       # might be redundant, the loop has already stopped
        loop.close(True)  # needed to close all open sockets
    print("Server shut down, exiting...")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17101502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档