微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python:按计划运行函数而不重叠某些执行

如何解决Python:按计划运行函数而不重叠某些执行

我一直在使用 schedule 模块在我的 python 代码中尝试和调度函数,但我认为我的用例超出了它的能力。

目前我有 4 个函数,我想按设定的时间表运行。 我想每小时运行一次 function_1,交替运行 function_2 和 function_3,每周运行一次 function_4。

我目前的工作安排如下:

schedule.every(1).hours.do(function_1)
schedule.every(2).hours.do(function_2)
schedule.every(3).hours.do(function_3)
schedule.every().monday.do(function_4_setup)

def function_4_setup()
    logger.debug("Clearing Schedule to run function_4 on its own")
    schedule.clear()
    sleep(3600)
    function_4()
    logger.debug("Restarting All Jobs")
    recreate_jobs() # re-adds function 1-3 to schedule

问题是这段代码将导致 function_2 和 function_3 同时或在 12 小时 18 小时和 24 小时后立即依次运行,这是我想避免的。

一个我期待的行为的例子:

  • 00:00:function_1 和 function_2 运行
  • 01:00:function_1 和 function_3 运行
  • 02:00:function_1 和 function_2 运行
  • 03:00:function_1 和 function_3 运行

... 1 周后...

  • 00:00 function_4 运行
  • 01:00 function_1 和 function_2 运行

我查看了 APScheduler,但该库似乎也不适合我的用例。任何建议/帮助将不胜感激!

解决方法

我建议不要单独调度函数 2 和函数 3,而是建议创建一个函数来触发这两个函数,而是每小时运行一次。例如:

boolean = True

def flip_funcs():
    global boolean
    boolean = not boolean
    [function_2,function_3][boolean]()

schedule.every(1).hours.do(flip_funcs)
    
,

您可以尝试使用 simple_scheduler。它允许更高程度的控制。

from simple_scheduler.event import event_scheduler
event_scheduler.timezones()
TZ = "Asia/Kolkata"
WHEN_1 = [f"*|0{h}:00" if h//10 == 0 else f"*|{h}:00" for h in range(0,24)]
WHEN_2 = [f"*|0{h}:00" if h//10 == 0 else f"*|{h}:00" for h in range(0,24,2)]
WHEN_3 = [f"*|0{h}:00" if h//10 == 0 else f"*|{h}:00" for h in range(1,2)]
event_scheduler.add_job(target = function_1,when = WHEN_1,tz = TZ)
event_scheduler.add_job(target = function_2,when = WHEN_2,tz = TZ)
event_scheduler.add_job(target = function_3,when = WHEN_3,tz = TZ)
event_scheduler.add_job(target = function_4_setup,when=["mon|00:00"],tz=TZ)

def function_4_setup():
    event_scheduler.clear()
    sleep(3600)
    function_4()
    recreate_jobs()
,

您是否尝试过对该函数进行多线程处理? https://www.tutorialspoint.com/python/python_multithreading.htm 这可能是你要找的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。