在开发Tornado应用程序时,我经常要重新启动服务器以获取新的更改。我点击ctrl-c来停止服务器,但是使用Tornado,这似乎很慢。在关闭之前等待很多秒,或者在发出ctrl-c时根本没有关闭。
奇怪的是,在点击ctrl-c之后,我向服务器发出了一个新请求(例如,通过刷新指向服务器的浏览器),它会立即关闭。
任何人都知道如何解释或修复它?有人经历过类似的事吗?
(注意,这是在Windows上。)
答案 0 :(得分:3)
在Python中,信号总是由主线程处理。如果从主线程运行IOLoop,它将在服务器空闲并等待IO时阻止它。结果,所有信号都将挂起在线程上唤醒。这就解释了为什么发送请求会关闭服务器。
更新:您可以尝试这样的事情:
def set_ping(ioloop, timeout):
ioloop.add_timeout(timeout, lambda: set_ping(ioloop, timeout))
然后:
ioloop = tornado.ioloop.IOLoop.instance()
set_ping(ioloop, timedelta(seconds=2))
ioloop.start()
开始循环时。因此,select
将在2.0秒超时时被调用,从而阻止阻塞。 (另见IOLoop Timeouts)
(注意:我无法在Linux上重现你的情况,即使我手动设置select
使用,所以我不能100%保证这会有所帮助,但听起来似乎合理)
答案 1 :(得分:2)
我不知道为什么退出Ctrl+C
需要这么长时间,但在某些情况下我可以按Ctrl+\
(Linux终端)
答案 2 :(得分:0)
add_timeout有效;如果你想节省重新注册超时,你可以这样做:
ili=tornado.ioloop.IOLoop.instance()
tornado.ioloop.PeriodicCallback(lambda: None,500,ili).start()
ili.start()