Python 为什么龙卷风在我撞到ctrl-c的时候花了这么长时间才消失?

Python 为什么龙卷风在我撞到ctrl-c的时候花了这么长时间才消失?,python,tornado,Python,Tornado,在开发Tornado应用程序时,我经常希望重新启动服务器以获取新的更改。我按ctrl-c停止服务器,但使用Tornado时,速度似乎非常慢。它在关闭之前等待了很多秒,或者在发出ctrl-c命令时根本没有关闭 奇怪的是,如果在单击ctrl-c后,我向服务器发出一个新请求(例如,刷新指向服务器的浏览器),它会立即关闭 有人知道如何解释或解决这个问题吗?有人经历过类似的事情吗 (注意,这是在Windows上。)我不知道为什么用Ctrl+C退出要花这么长时间,但在某些情况下,按Ctrl+\(Linux终

在开发Tornado应用程序时,我经常希望重新启动服务器以获取新的更改。我按ctrl-c停止服务器,但使用Tornado时,速度似乎非常慢。它在关闭之前等待了很多秒,或者在发出ctrl-c命令时根本没有关闭

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

有人知道如何解释或解决这个问题吗?有人经历过类似的事情吗


(注意,这是在Windows上。)

我不知道为什么用
Ctrl+C
退出要花这么长时间,但在某些情况下,按
Ctrl+\
(Linux终端)

在Python中,信号总是由主线程处理。如果IOLoop是从主线程运行的,那么当服务器空闲并等待IO时,它将阻止IOLoop。因此,线程上的所有信号都将挂起以唤醒。这就解释了为什么发送请求会关闭服务器

更新:您可以尝试以下方法:

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秒,以防止阻塞。(另见)


(注意:我无法在Linux上重现您的情况,即使我手动设置要使用的
选择,所以我不能100%保证这会有所帮助,但听起来似乎有道理)

添加超时有效;如果要在重新注册超时时保存,则可以执行以下操作:

ili=tornado.ioloop.IOLoop.instance()
tornado.ioloop.PeriodicCallback(lambda: None,500,ili).start()
ili.start()

这是一个简单的Tornado应用程序,您是否使用数据库连接器或其他模块进行通信?ctrl-c和线程之间有一些有趣的交互,所以了解一下会很有用。@koblas:我正在使用websockets,但目前还没有数据库。啊,这很有趣,也很有意义。我想知道是否有办法让Tornado在没有IO的情况下周期性地唤醒它的主线程?如果它能每隔一秒钟左右进行一次轮询,这就解决了我的问题。现在它更简单了:
tornado.ioloop.PeriodicCallback(lambda:None,1000)。start()tornado.ioloop.ioloop.current().start()