运行 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()
如何从今天开始每天随机 运行 安排作业?我想使用 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()