我已按照此处
所示的示例进行操作它按预期工作,但有一个小问题。如果 do_job() 方法需要一分钟以上才能完成。它在 do_job() 方法结束后再等待 1 分钟并安排另一次计算。
但我希望它从执行时间开始后 1 分钟开始计时。有没有可能这样做。非常感谢任何建议。
编辑
import schedule
import time
def job():
print("Process triggered at:", time.strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(30)
print("Process ended at:", time.strftime("%Y-%m-%d %H:%M:%S"))
# Define the frequency (in seconds) at which the process should be triggered
frequency_seconds = 60 # Trigger every 60 seconds
# Schedule the job to run at the specified frequency
schedule.every(frequency_seconds).seconds.do(job)
# Main loop to keep the script running
while True:
schedule.run_pending()
time.sleep(1) # Sleep for 1 second to avoid high CPU usage
在上面的代码中,生成的输出如下:
流程触发时间:2024-03-25 06:57:23
流程结束于:2024-03-25 06:57:53
流程触发于:2024-03-25 06:58:54
流程结束于:2024-03-25 06:59:24
观察到第一个进程结束后会触发下一个进程。第一个进程结束时间和第二个进程开始时间之间的时间差为 60 秒。
但是我的期望是第一个进程触发时间和第二个进程触发时间之间的时间差应该是 60 秒。
60 秒不应从进程结束时间开始计算。 job() 应该每隔 60 秒调用一次。所以预期的输出将如下所示:
流程触发时间:2024-03-25 06:57:23
流程结束于:2024-03-25 06:57:53
流程触发时间:2024-03-25 06:58:23
流程结束于:2024-03-25 06:58:53
我希望期望的输出能够阐明我想要实现的目标。再次提前感谢您花时间阅读和回复。
如果您的目标是自上一个作业的 start 开始指定秒数而不是自上一个作业的 end 开始作业,您可以使用以下代码:
#!/usr/bin/env python3
import sched, time
# Define the frequency (in seconds) at which the process should be triggered
frequency_seconds = 60 # Trigger every 60 seconds
priority = 1
# Create a scheduler
s = sched.scheduler(time.time, time.sleep)
def job():
# Reschedule ourselves for next run
s.enterabs(time.time() + frequency_seconds, priority, job)
print("Process triggered at:", time.strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(25)
print("Process ended at:", time.strftime("%Y-%m-%d %H:%M:%S"))
# Start first job immediately, i.e. delay=0
s.enter(0, priority, job)
# Keep running future jobs
s.run()
如果您担心以前的作业仍在运行时无法启动新作业。也就是说,您希望每分钟启动一次新作业,即使它们需要 90 秒才能运行,您可能必须使用线程。请说是否是这个问题。