From 0a744372537598c7ace9ab22220a9e5906b2e6b8 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sun, 18 Aug 2024 22:24:24 +0800 Subject: [PATCH] feat(TimerUtils): add random_even_scheduler for evenly distributed schedule creation --- app/utils/timer.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/app/utils/timer.py b/app/utils/timer.py index 45a08c2d..e220e316 100644 --- a/app/utils/timer.py +++ b/app/utils/timer.py @@ -1,6 +1,6 @@ +import datetime import random from typing import List -import datetime class TimerUtils: @@ -41,6 +41,35 @@ class TimerUtils: return trigger + @staticmethod + def random_even_scheduler(num_executions: int = 1, + begin_hour: int = 7, + end_hour: int = 23) -> List[datetime.datetime]: + """ + 按执行次数尽可能平均生成随机定时器 + :param num_executions: 执行次数 + :param begin_hour: 计划范围开始的小时数 + :param end_hour: 计划范围结束的小时数 + """ + trigger_times = [] + start_time = datetime.datetime.now().replace(hour=begin_hour, minute=0, second=0, microsecond=0) + end_time = datetime.datetime.now().replace(hour=end_hour, minute=0, second=0, microsecond=0) + + # 计算范围内的总分钟数 + total_minutes = int((end_time - start_time).total_seconds() / 60) + # 计算每个执行时间段的平均长度 + segment_length = total_minutes // num_executions + + for i in range(num_executions): + # 在每个段内随机选择一个点 + start_segment = segment_length * i + end_segment = start_segment + segment_length + minute = random.randint(start_segment, end_segment - 1) + trigger_time = start_time + datetime.timedelta(minutes=minute) + trigger_times.append(trigger_time) + + return trigger_times + @staticmethod def time_difference(input_datetime: datetime) -> str: """