运行 Python 每天随机安排

Running Python schedule daily at random times

如何从今天开始每天随机 运行 安排作业?我想使用 schedule 包。

pip install schedule

import schedule

def job()
   print("foo")
   return schedule.CancelJob

while True:
   time_str = '{:02d}:{:02d}'.format(random.randint(6, 10), random.randint(0, 59))
   print("Scheduled for {}".format(time_str))
   schedule.every().day.at(time_str).do(job)
   schedule.run_pending()

上面的代码只是自旋:

Scheduled for 06:36
Scheduled for 10:00
Scheduled for 06:18

您通过将随机时间生成器放入 while 循环来提供移动目标。具体来说,在查看源代码 here 后,很明显如果 datetime.datetime.now() >= self.next_run 为真,作业只会 运行 (参见 scheduler.run_pending()job.should_run() 定义)。因为你总是在移动 job.next_run,所以只有当它恰好在循环的特定迭代中过去时,你才会击中它。有趣的是,我认为这会导致一个错误,即当您接近 24:00 时,实际 运行 找到工作的可能性会增加,尽管这尚未得到证明。我认为您需要创建一个单独的函数来生成下一个随机时间,并从您的工作函数中调用它。例如:

import schedule
import time
import random

def job():
   print("foo")
   schedule_next_run()
   return schedule.CancelJob

def schedule_next_run():
   time_str = '{:02d}:{:02d}'.format(random.randint(6, 10), random.randint(0, 59))
   schedule.clear()
   print("Scheduled for {}".format(time_str))
   schedule.every().day.at(time_str).do(job)

schedule_next_run()

while True:
   schedule.run_pending()
   time.sleep(60)

请注意,作业开始当天的示例可能不是随机的,因为您的随机时间可能在您碰巧启动脚本的时间之前。您可以在第一天选择一个未来的随机时间来工作,以根据需要规避此问题。

为了验证上面的例子,我使用了更短的时间跨度。以下对我有用:

import schedule
import time
import random

def job():
   print("foo")
   schedule_next_run()
   return schedule.CancelJob

def schedule_next_run():
   time_span = random.randint(1, 5)
   schedule.clear()
   print(f'Scheduled in {time_span} seconds')
   schedule.every(time_span).seconds.do(job)

schedule_next_run()

while True:
   schedule.run_pending()