在python的模块调度中,如何在作业运行后打印下一次运行时间?

问题描述 投票:0回答:1

在使用 python 的调度模块运行待处理作业后,我想打印一次“下一个作业安排在 {next_job_time}”。

这段代码每秒打印一条消息,这不是我想要的:

import schedule
import time

def Job():
    #doing something...

schedule.every(1).hours.do(Job)

while True:
    schedule.run_pending()
    print(f"next job scheduled at {schedule.next_run()}")
    time.sleep(1)

我考虑过在 Job 周围使用装饰器,在执行作业后立即打印消息,但是当我这样做时,打印的时间是当前执行的时间,而不是下一个执行的时间。我认为这是因为装饰者在计划之前完成他们的工作,将工作标记为已完成并更新工作列表。

知道如何在作业完成后立即打印消息并仍然获得正确的 next_run 时间吗?

python python-decorators schedule
1个回答
0
投票

我还发现使用装饰器似乎会产生奇怪的结果,所以我进入循环并在那里显示下一次运行。关键是将这次“下一次运行”与我们上次显示的运行进行比较,并且仅在不同时才显示。

#!/usr/bin/env python3
import time

import schedule


def job():
    print("job")


def job2():
    print("job2")


last = None
schedule.every(10).seconds.do(job)
schedule.every(7).seconds.do(job2)

while True:
    schedule.run_pending()

    # Display next run, without repeat
    next_run = schedule.next_run()
    if next_run != last:
        print(f"Next run: {next_run}")
    last = next_run

    time.sleep(1)

输出示例:

Next run: 2024-03-02 06:32:37.449988
job2
Next run: 2024-03-02 06:32:40.449978
job
Next run: 2024-03-02 06:32:44.478158
job2
Next run: 2024-03-02 06:32:50.486706
job
Next run: 2024-03-02 06:32:51.499801
job2
Next run: 2024-03-02 06:32:58.520998
job2
Next run: 2024-03-02 06:33:00.518501
© www.soinside.com 2019 - 2024. All rights reserved.