![](/img/trans.png)
[英]Python Celery run set of functions on set on envs without overlapping
[英]Python: run functions on a schedule without overlapping some execution
我一直在使用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 小時后同時運行或立即運行,這是我想避免的。
給你一個我期待的行為的例子:
... 1 周后...
我已經查看了APScheduler ,但該庫似乎也不適合我的用例。 任何建議/幫助將不勝感激!
我建議不要單獨安排 function 2 和 3 ,而是制作一個 function 來觸發 2 個函數,而是每小時運行一次。 例如:
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,24,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()
您是否嘗試過在 function 上進行多線程處理? https://www.tutorialspoint.com/python/python_multithreading.htm這可能是您正在尋找的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.