如何实现基于分钟数组的多时间段通用定时告警功能?
解决方案
1. 封装通用倒计时函数
先把重复的倒计时逻辑抽成可复用函数,避免冗余代码:
import time from datetime import timedelta def countdown(seconds, label): while seconds > 0: remaining = timedelta(seconds=seconds) print(f"{label}: {remaining}", end="\r") time.sleep(1) seconds -= 1 print(f"\n{label} 触发!")
2. 批量处理时间块与告警
假设总时长拆分为固定时长的时间块(比如15分钟/块),每个块内的告警时间是相对于块起始的分钟数,通过遍历实现批量触发:
# 可配置参数 total_task_minutes = 60 # 用户输入的总任务时长 block_duration_minutes = 15 # 单个时间块时长 block_alarm_minutes = [5, 3, 8, 10] # 每个块内的告警触发点(相对于块起始的分钟数) post_alarm_wait_seconds = 30 # 告警触发后的等待时长 # 计算时间块总数 total_blocks = total_task_minutes // block_duration_minutes for block_idx in range(total_blocks): block_num = block_idx + 1 print(f"\n=== 第 {block_num} 个时间块启动 ===") # 等待到当前时间块的起始时间(第一个块无需等待) block_start_delay = block_idx * block_duration_minutes * 60 countdown(block_start_delay, f"等待进入第 {block_num} 块") # 处理当前块内的所有告警 for alarm_idx, alarm_min in enumerate(block_alarm_minutes): alarm_num = alarm_idx + 1 alarm_seconds = alarm_min * 60 # 触发告警倒计时 countdown(alarm_seconds, f"块{block_num}告警{alarm_num}") # 告警后等待返回 countdown(post_alarm_wait_seconds, f"块{block_num}告警{alarm_num}后返回")
逻辑说明
- 通用
countdown函数统一处理倒计时的打印、延时和结束提示,只需传入时长和标识即可。 - 时间块遍历:根据总时长和块时长计算块数量,每个块先等待到对应起始时间(第一个块起始延迟为0,直接进入)。
- 告警遍历:每个块内的告警时间是相对块起始的,直接传入
countdown即可完成触发,后续的返回等待逻辑也通过同一函数实现。
这样不管有多少时间块和告警,都能自动批量处理,无需重复编写倒计时循环。
内容的提问来源于stack exchange,提问作者randomdev2357
相关产品推荐
相关产品推荐

