如何更温和地检查一些代码的一部分每天运行4次

时间:2017-07-04 08:05:57

标签: python datetime

我有crontab运行的脚本,我希望每天执行4次代码的一部分。

我有一段代码

from datetime import datetime, time
now = datetime.now()
now_time = now.time()
if now_time == time(10,00) or now_time == time(16,00) or now_time == time(22,00) or now_time == time (4,00):
    func()

这个解决方案的减号是这部分代码可以在10.01,10.02上执行,并且会以这种方式跳过。

是否有更温和,更短的方式来记下这部分代码?

谢谢!

4 个答案:

答案 0 :(得分:1)

你可以做的是修改你的脚本以接受一个(额外的)参数,该参数将触发代码的特定部分的执行。然后,您可以修改crontab列表,以便在所需的时间使用该额外参数调用脚本。

所以,如果你想在整个半小时内运行脚本,并在4,10,16和22点做额外的事情,你可以在crontab文件中放入以下三行:

30 * * * * <script> # Thirty minutes after each hour
0 1-3,5-9,11-15,17-21,23 * * * <script> # Every whole hour, except the four designated hours
0 4,10,16,22 * * * <script with extra argument> # Script with extra argument at designated hours.

通过这种方式,脚本每30分钟运行一次,但是在指定的时间,脚本将使用额外的参数运行。

答案 1 :(得分:1)

如果您可以灵活地转移到APScheduler(http://apscheduler.readthedocs.io/en/latest/userguide.html),您的工作将变得更加轻松,代码也更加可靠。

from apscheduler.schedulers.background import BackgroundScheduler

# assuming tick is your function
scheduler = BackgroundScheduler()
#cron which runs once in 6 hours
scheduler.add_job(tick, 'cron', hour='*/6')
scheduler.start()

答案 2 :(得分:0)

我看到两种解决问题的方法。

1)使用全局变量作为计数器

numOfCalls = 0
#for every func() call
func()
numOfCalls = numOfCalls + 1

2)每次执行函数时,时间戳和函数名称都可能被写入某个日志文件

from datetime import datetime, time
current_time = datetime.now().time()

with open("log.txt", "a") as myfile:
    myfile.write("func " + str(current_time) + "\n")

答案 3 :(得分:0)

你所追求的是时间间隔。从同一个包datetime,您可以创建timedelta个对象(两个日期时间之间的差异)并将它们转换为秒

您的代码变为:

from datetime import datetime, time
now = datetime.now()
today = now.date()
minutes_accepted = 5
execution_times = [time(hour=10), time(hour=16), time(hour=22)]
for delta in [datetime.combine(today, et) - now for et in execution_times]:
    if abs(delta.total_seconds()) < minutes_accepted * 60:
        print 'func'