云烟成雨 发表于 2023-3-31 11:21

关于schedulers定时器的疑惑

本帖最后由 云烟成雨 于 2023-3-31 11:26 编辑

代码如下:

import time
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler(timezone='Asia/Shanghai')

def main():
    print('main:' + datetime.datetime.now().strftime('%H:%M:%S'))
    time.sleep(5)
    print('wait 5s do something')
scheduler.add_job(main, 'interval', days=0, hours=0, minutes=0, seconds=10);
scheduler.start();



定时执行时间为10秒,定时执行的函数main内部有一个time.sleep延迟,但是这个延迟并没有导致定时器interval的延迟,这个怎么解决?
我希望是main函数下次执行的时间是15秒以后(10秒+main函数内部5秒的延迟),而不是依然是10秒后。(interval的时间间隔不能改写为15秒,因为我不知道程序执行的具体时间是多少,会造成不精确)


因为遇到个问题是我写的程序main内部是需要有time.sleep延迟的,sleep后还需要进行一些代码执行,怎么让interval下次执行的时间间隔在main函数执行结束后的时间开始算起,而不是main函数执行开始时就开始计时了


我目前的解决是改回了使用time.sleep递归的方式定时执行,但是我觉得schedulers应该也可以实现才对,请大佬指教

saszznz 发表于 2023-3-31 12:24

~零度 发表于 2023-3-31 15:07

import time
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime

scheduler = BlockingScheduler(timezone='Asia/Shanghai')
last_executed_time = None


def main():
    global last_executed_time
    if last_executed_time is not None:
      time.sleep(max(0., 10 - time.time() + last_executed_time)) #距离上次完成执行的时间如果不到10秒则等待一段时间
    print('main:' + datetime.datetime.now().strftime('%H:%M:%S'))
    time.sleep(5)
    print('wait 5s do something')
    last_executed_time = time.time()


scheduler.add_job(main, 'interval', days=0, hours=0, minutes=0, seconds=10, max_instances=1) #最多运行一个实例
scheduler.start()

云烟成雨 发表于 2023-3-31 17:10

~零度 发表于 2023-3-31 15:07
import time
from apscheduler.schedulers.blocking import BlockingScheduler
...

main函数前面加延迟时间啊,变相解决,哈哈哈
页: [1]
查看完整版本: 关于schedulers定时器的疑惑