Flask调度器实现每小时随机分钟执行任务的问题求助
Flask调度器实现每次随机秒数执行任务的问题求助
嘿,各位大佬,我碰到个APScheduler的小问题,想请大家帮忙看看:
我写了一段Flask里用调度器的代码,本意是想让任务每分钟执行一次,但每次的执行秒数是随机的,结果现在的情况是,第一次随机选了一个秒数(比如10秒)之后,后面每次都固定在这个秒数执行,根本不会重新随机。我的代码是这样的:
scheduler.add_job(id='my_job1', func=my_job, trigger='cron', second=str(random.randint(1,59)), minute='*', hour='*', args=[app]) scheduler.init_app(app) scheduler.start()
我试了好几次,每次都是第一次随机的秒数被固定下来,完全达不到每次随机的效果,有没有大佬知道该怎么改呀?
问题原因分析
其实问题很好理解:咱们写的str(random.randint(1,59))这部分代码,是在添加任务的瞬间就执行完毕了,生成了一个固定的字符串(比如'10'),之后调度器就一直用这个固定值作为触发的秒数,自然不会再重新随机啦。
解决办法
方法一:给cron触发器传一个生成随机秒数的函数
APScheduler的cron触发器支持直接传一个可调用函数作为字段值,每次需要计算下一次触发时间的时候,都会调用这个函数生成新的数值。咱们可以这么改:
import random def get_random_second(): # 每次调用都返回一个新的随机秒数字符串 return str(random.randint(1,59)) # 添加任务的时候,直接把函数传进去,不要加括号调用! scheduler.add_job(id='my_job1', func=my_job, trigger='cron', second=get_random_second, minute='*', hour='*', args=[app]) scheduler.init_app(app) scheduler.start()
这样每次调度器要计算下一次什么时候触发,都会调用get_random_second()生成新的随机秒数,完美解决固定值的问题~
方法二:每次任务执行完后重新调度下一次
如果觉得方法一不够直观,咱们也可以换个思路:不用cron触发器,改用date触发器,每次任务执行完毕后,手动计算下一次的随机执行时间,再添加一个新的任务。代码大概是这样:
import random from datetime import datetime, timedelta def my_job(app): # 这里写你的任务逻辑 print("任务执行中...") # 计算下一次执行时间:当前时间加1分钟,然后随机秒数 next_run = datetime.now() + timedelta(minutes=1) next_run = next_run.replace(second=random.randint(1,59), microsecond=0) # 添加下一次的任务 scheduler.add_job(id='my_job1', func=my_job, trigger='date', run_date=next_run, args=[app]) # 第一次启动时添加第一个任务 first_run = datetime.now().replace(second=random.randint(1,59), microsecond=0) scheduler.add_job(id='my_job1', func=my_job, trigger='date', run_date=first_run, args=[app]) scheduler.init_app(app) scheduler.start()
这个方法相当于每次任务跑完就“预约”下一次的随机时间,也能实现需求,就是代码稍微多一点~
备注:内容来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

