意外的tornado.ioloop.PeriodicCallback行为

Pat*_*ime 4 python tornado

试图弄清楚如何PeriodicCallback安排,我写了这个脚本:

import time
import tornado.ioloop

t0 = time.time()

def foo():
    time.sleep(1)
    print(time.time() - t0)

tornado.ioloop.PeriodicCallback(foo, 2000).start()
tornado.ioloop.IOLoop.instance().start()
Run Code Online (Sandbox Code Playgroud)

我预计它会每2秒或每3秒触发一次,具体取决于龙卷风是否等到完成以安排下一个事件.但是,我得到了这个:

3.00190114975
6.00296115875
10.0029530525
14.0029621124
18.0029540062
22.0050959587
26.0040180683
30.005161047
34.0053040981
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Ben*_*ell 6

睡觉,即使在"背景"PeriodicCallback中,在龙卷风应用程序中也不是一个好主意,因为它会阻止IOLoop并且可以阻止它适当地安排事情.如果您正在使用Tornado,则需要使用非阻塞等效项替换所有长阻塞调用(或将其移至其他线程).用IOLoop.add_timeout替换睡眠,用IOStream或其他异步库等进行网络操作.

  • 这看起来像是一个调度中的错误 - 当没有任何事情发生但是超时时,回调本身的运行时间会干扰调度代码.它类似于https://github.com/tornadoweb/tornado/issues/947 (2认同)