当设置为很长时间以后的Python脚本计时器不运行(Python timer script does

2019-09-21 08:02发布

我正在试图做的是在特定时间执行脚本,并在大多数情况下,当我运行它从执行短的时间内,围绕说10它的工作 - 15分钟。 所以,我将运行计时器脚本和10 - 24分钟后,它执行它的命令。

下面是我使用的代码:

import time
import myscript
from sys import exit

while 1:
        if time.strftime("%H") == "7" and time.strftime("%M") == "15":
                myscript.main()
                exit()

我要的是让脚本在早上日常执行。 当我在一天到达我的电脑后,我可以看到,脚本停留在这个过程中。

与安装了Cygwin我已经试过这两台机器上,一个Ubuntu 12.04 64位盒子和一个Windows XP的方块,他们都表现出同样的问题。 当我离开电脑,我只锁定他们,而不是把它们处于待机状态。 我试着运行脚本和锁定它,然后短解锁,但我可以看到,这不是问题,因为脚本运行正常。

另外要注意,当我到我的电脑,它似乎是运行非常laggy和这个剧本似乎是采取非常多的CPU占用率,在30范围 - 50%。

还有什么我错过了,或者这是不是去了解它的理想方式?

Answer 1:

在那里有没有睡觉解释了为什么你的系统怪胎。 它一样快,你的CPU可以去打转。

如果你只是一个包装脚本,将在特定时间运行功能试验,你可以这样做:

from datetime import datetime
import time

while True:
    now = datetime.now()
    if now.hour == 7 and now.minute == 15:
        foo()
    time.sleep(10)

但这里是思考的一个大问题。 如果发生什么foo()需要很长的时间或者从自己的操作挂起?

什么可能已经在你的案件已经发生的事情是,你的睡眠(被设置为60秒)可能有真的错过了分钟的窗口。 你将不得不睡较小的增量,以确保您检查分多次。

除此之外,使用cron作业。 它的目的是做计划的任务。 cron将会在你提到你正在使用的反正外壳cygwin的存在。 这里指的在Windows上设置了一个crontab



Answer 2:

更新 :如果您需要在第一次机会上午7:15后正好运行一次:

now = datetime.now()
dt = now.replace(hour=7, minute=15) #note: ignore seconds, microseconds
if dt < now:
   dt += timedelta(days=1) #note: might miss by an hour on DST transition day
assert dt >= now
delay = (dt - datetime.now()).total_seconds()
Timer(delay, myscript.main).start()

它运行main在上午7:15或之后不久,计算机已经苏醒,如果它是睡着了7:15。


至于其他的都表示现有的解决方案例如cron,Windows任务调度程序可能最好在指定时间运行的脚本。

为了避免明确繁忙的循环,你可以使用threading.Timer()

#!/usr/bin/env python
from datetime  import datetime, timedelta
from threading import Timer

import myscript

def run_at(dt, func, step=timedelta(days=1), tolerance=timedelta(minutes=1)):
    if abs(dt - datetime.now()) < tolerance:
       func() # don't schedule if it raises an exception

    now = datetime.now()
    while dt < now:
        dt += step

    delay = (dt - datetime.now()).total_seconds()
    Timer(delay, run_at, [dt, func]).start()

dt = datetime.now().replace(hour=7, minute=15)
run_at(dt, myscript.main)

它在本地时间7:15调用日常的主要功能。

它会跳过调用,如果前一个尚未完成或您的计算机是在7:15暂停。 它可能会跳过DST过渡天。

它应该工作。如果系统时钟设置前进/后退的调用之间。

为了处理更复杂的调度规范,你可以使用Python中的crontab语法, 例如 。



文章来源: Python timer script doesn't run when set to long periods later