【问题标题】:periodiccallback of asynchronous function异步函数的周期性回调
【发布时间】:2018-03-20 09:35:40
【问题描述】:

PeriodicCallback 是否确保没有并行执行?是在前一个触发的回调仍在运行时触发了回调,还是确保一次只有一个回调在运行?据我所知,后者是真的,但我想确定一下!我应该控制异步函数的时间不超过下一个periodiccallback调度程序。

例如:

如果我每 5 秒有一个 periodiccallback 并且我的函数时间有时(因为发出 http 请求等)更长(例如 7 秒),我怎样才能跳过“10 秒”并传递到 15?只有当它发生时。

【问题讨论】:

    标签: python asynchronous parallel-processing tornado periodicity


    【解决方案1】:

    龙卷风文档说

    如果回调运行时间超过 callback_time 毫秒,则将跳过后续调用以按计划返回。

    因此,如果我正确理解您的问题,PeriodicCallback 已经完全按照您的要求进行操作如果您的回调是同步函数

    如果您的回调不是同步的,那么您将需要使用锁来检查自己是否已经在运行某些东西。比如:

    from tornado import gen, locks
    
    lock = locks.Lock()
    running = False
    @gen.coroutine
    def task():
        global running
        with (yield lock.acquire()):
            if running:
                return
            running = True
        try:
            yield do_something()
        finally:
            with (yield lock.acquire()):
                running = False
    

    http://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.PeriodicCallback

    【讨论】:

    • 但是异步函数有区别吗?在这种情况下,periodicCallback 如何知道后续是否完成?
    • 对,对不起,我错过了你问题的异步部分。我已经修改了我的答案,我将如何处理异步回调,但我还没有真正测试过,所以先试试吧……
    • 好的,我试试,谢谢!但是我在哪里可以设置日程安排时间? Task() 函数是从periodicCallback 开始的?
    • 是的,task 只是您的 do_something 协程的包装器,您可以将其传递给 PeriodicCallback 来安排它
    • 好的,可以这样:periodicCallback(task(), 5000) # 每 5 秒 Task() {...} # 从周期性调用,但前提是 do_something 完成 do_something() {. ..} # 做某事的函数(可能超过 5 秒...)对吗? :) ps:nonlocal是全局python语句?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2021-02-20
    • 2017-11-27
    • 2015-01-22
    • 2021-06-12
    相关资源
    最近更新 更多