当我点击ctrl-c时,为什么龙卷风需要这么长时间才能死?

时间:2012-03-06 05:14:32

标签: python tornado

在开发Tornado应用程序时,我经常要重新启动服务器以获取新的更改。我点击ctrl-c来停止服务器,但是使用Tornado,这似乎很慢。在关闭之前等待很多秒,或者在发出ctrl-c时根本没有关闭。

奇怪的是,在点击ctrl-c之后,我向服务器发出了一个新请求(例如,通过刷新指向服务器的浏览器),它会立即关闭。

任何人都知道如何解释或修复它?有人经历过类似的事吗?

(注意,这是在Windows上。)

3 个答案:

答案 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()