Python Tornado中的计划读取操作

Python Tornado中的计划读取操作,python,tornado,Python,Tornado,在Tornado中安排周期性后台函数调用的最佳解决方案是什么?如前所述,我考虑过使用tornado.ioloop.PeriodicCallback。spawn_回调可以用于调度吗?我想要实现的是一个简单的服务器,除了它的其他职责外,它还可以定期从本地网络中的系统获取信息。PeriodicCallback可能是最简单的解决方案,只要您不必担心任务运行时间超过其预定时间 @gen.coroutine def refresh() resp = yield AsyncHTTPClient().f

在Tornado中安排周期性后台函数调用的最佳解决方案是什么?如前所述,我考虑过使用tornado.ioloop.PeriodicCallback。spawn_回调可以用于调度吗?我想要实现的是一个简单的服务器,除了它的其他职责外,它还可以定期从本地网络中的系统获取信息。

PeriodicCallback
可能是最简单的解决方案,只要您不必担心任务运行时间超过其预定时间

@gen.coroutine
def refresh()
    resp = yield AsyncHTTPClient().fetch(url)
    ...

def main():
    ...
    PeriodicCallback(refresh, 3600).start()
    ...
如果您担心超支,我可能会将整个过程打包成一个循环:

@gen.coroutine
def refresh_loop(interval=3600):
    next_time = IOLoop.current().time()
    while True:
        next_time += interval
        yield refresh()
        while next_time <= IOLoop.current().time():
            next_time += interval
        yield gen.Task(IOLoop.current().call_at, next_time)
@gen.coroutine
def刷新_循环(间隔=3600):
next_time=IOLoop.current().time()
尽管如此:
下一次时间+=间隔
产量刷新()

下次谢谢你,本!因为您已将3600设置为间隔:我不理解链接线程中指出的~4s延迟。这是否意味着,如果我将其设置为333,间隔会有所不同,但请求数大约等于每秒3次(不是问题),或者3600是最短的可能间隔长度?3600(一小时)只是一个例子;您可以使用任何间隔,包括次秒分数。但间隔越短,越有可能出现超限问题。