You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每日设定时段内随机次数执行Python函数?

实现每日指定时间区间内随机执行函数若干次的Python方案

看起来你已经在搭建每日随机执行任务的基础框架了,我帮你把代码补全并优化,让它更实用、健壮。你的核心需求是每天在指定的时间窗口内,随机挑选若干个时间点执行目标函数,下面是完整的实现方案:

完整代码实现

我们用Python标准库来实现,避免依赖第三方工具(如果之前用的radar库可以替换成下面的自定义随机时间函数):

import datetime
import random
from datetime import timedelta

def get_epochtime(dt=datetime.datetime.now()) -> float:
    """将datetime对象转换为Unix时间戳"""
    EPOCH = datetime.datetime(1970, 1, 1)
    return (dt - EPOCH).total_seconds()

def random_datetime(start: datetime.datetime, stop: datetime.datetime) -> datetime.datetime:
    """生成两个时间点之间的随机datetime对象"""
    delta = stop - start
    random_seconds = random.randint(0, int(delta.total_seconds()))
    return start + datetime.timedelta(seconds=random_seconds)

def get_todays_run_schedule(runs_per_day: int, run_between: tuple[int, int]) -> list[float]:
    """
    生成今日(或次日,若当前时间已过窗口)指定时间区间内的随机执行时间戳列表
    :param runs_per_day: 每日需要执行的次数
    :param run_between: 时间窗口,格式为(开始小时, 结束小时),例如(9, 17)代表9:00-17:00
    :return: 按时间排序的Unix时间戳列表
    """
    now = datetime.datetime.now()
    # 初始化当日的时间窗口起止时间
    window_start = now.replace(hour=run_between[0], minute=0, second=0, microsecond=0)
    window_end = now.replace(hour=run_between[1], minute=0, second=0, microsecond=0)
    
    # 处理当前时间已超出当日窗口的情况:自动切换到次日的时间窗口
    if now > window_end:
        window_start += timedelta(days=1)
        window_end += timedelta(days=1)
    
    # 生成随机时间并转换为时间戳
    schedule_timestamps = [
        get_epochtime(random_datetime(window_start, window_end))
        for _ in range(runs_per_day)
    ]
    # 对时间戳排序,方便后续按顺序执行任务
    schedule_timestamps.sort()
    return schedule_timestamps

如何使用这个日程生成器

假设你有一个需要执行的目标函数my_target_function,我们可以用schedule库来轻松安排任务(先通过pip install schedule安装):

import schedule
import time

def my_target_function():
    """你需要随机执行的目标函数"""
    print(f"函数执行成功!当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

def setup_daily_tasks():
    # 获取当日的随机执行时间戳(这里设置为每天9:00-18:00之间执行3次)
    daily_run_timestamps = get_todays_run_schedule(runs_per_day=3, run_between=(9, 18))
    
    # 将时间戳转换为具体时间,添加到日程调度中
    for timestamp in daily_run_timestamps:
        run_datetime = datetime.datetime.fromtimestamp(timestamp)
        # 按时分秒格式设置每日任务
        schedule.every().day.at(run_datetime.strftime("%H:%M:%S")).do(my_target_function)
    
    # 启动调度循环,每分钟检查一次是否有任务需要执行
    while True:
        schedule.run_pending()
        time.sleep(60)

if __name__ == "__main__":
    setup_daily_tasks()

额外的优化建议

  • 跨午夜时间窗口处理:如果你的时间窗口是跨午夜的(比如(23, 2)),可以修改get_todays_run_schedule函数,拆分时间窗口为「当日23:00到次日0:00」和「次日0:00到2:00」两部分,再分别生成随机时间。
  • 无第三方库替代方案:如果不想用schedule,可以自己写循环,每隔一段时间检查当前时间是否在生成的时间戳±1分钟范围内,符合条件就执行函数。
  • 日程持久化:如果程序可能重启,可以把生成的时间戳保存到本地文件或数据库,重启后读取并重新设置任务,避免丢失已生成的日程。

内容的提问来源于stack exchange,提问作者DMCoding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:16:21