我正在试图做的是在特定时间执行脚本,并在大多数情况下,当我运行它从执行短的时间内,围绕说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%。
还有什么我错过了,或者这是不是去了解它的理想方式?
在那里有没有睡觉解释了为什么你的系统怪胎。 它一样快,你的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
更新 :如果您需要在第一次机会上午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语法, 例如 。