0

我有一个项目,我已经分配了一周中的某些日子来运行,而其他不包括在内的日子应该被跳过。例如:

营业日:周一 (0)、周二 (1)、周三 (2)、周四 (3)、周五 (4) 休息日:周六 (5)、周日 (6)

我在注册表中保存了几天的设置,当设置被拉出时,它们被他们的工作日编号引用。

如果我想让我的应用在周五 (4) 进入睡眠状态,并在周一 (0) 唤醒它,我该怎么做?我无法确定休息日是否会保持一致,可能是星期日/星期一休息而不是星期六/星期日。

理想情况下,我需要查看当前的工作日数,看看它是否在天数列表中,如果不是,让它计算直到第二天开始的秒数。

场景:

  1. 我将脚本设置为在 6 月 8 日星期五睡觉,而星期六/星期日是休息日,我如何计算这两天的睡眠秒数,以便在 11 日星期一重新开始?

  2. 我将脚本设置为在 6 月 6 日星期三睡觉,我需要它在 6 月 8 日星期五醒来,然后在星期五晚上将其关闭,以便在星期一早上重新开始。

因为天数是可变的,所以这个函数必须能够适应它;这就是我遇到问题的地方。

任何帮助将不胜感激,在此先感谢!

4

2 回答 2

1

每天检查一次 - 如果今天不是 On 日,请继续睡觉直到明天。

或者

使用cron(或 Windows 任务计划程序)将程序安排到所需的日期。

或者

import datetime
from time import sleep

SECONDS_PER_DAY = 3600 * 24
DAILY_START_TIME = datetime.time(8,15)   # 8:15 am

def seconds(t):
    return 3600*t.hour + 60*t.minute + t.second

def now():
    t = datetime.datetime.now()
    return t.weekday(), seconds(t)

def load_run_days():
    # get data from registry
    return [1,1,1,1,1,0,0]

def days_until_next_run(today, run_days=None):
    if run_days is None:
        run_days = load_run_days()
    # rotate
    run_days = run_days[today+1:] + run_days[:today+1]
    # find next On day
    for days,_on in enumerate(run_days, 1):
        if _on:
            return days
    # no run day found?
    raise ValueError("No 'On' days found")

def sleep_until_next_run():
    today, elapsed = now()
    days_to_wait = days_until_next_run(today)
    sleep(-elapsed + days_to_wait*SECONDS_PER_DAY + seconds(DAILY_START_TIME))

def main():
    while True:
        try:
            sleep_until_next_run()
        except ValueError:
            break

        do_my_stuff()

if __name__=="__main__":
    main()
于 2012-06-04T16:15:21.493 回答
0
# Assume this is retrieved from registry
runningOn[0] = True # Monday
runningOn[1] = True
runningOn[2] = True
runningOn[3] = True
runningOn[4] = True
runningOn[5] = True
runningOn[6] = True # Sunday

# Get current day of week
import datetime
currentDayOfWeek = datetime.datetime.now().weekday()

# How much time should we sleep?
sleepDays = 1 # at least a day
for i in range(1, 6):
    if runningOn[(i + currentDayOfWeek) % 7]:
        break
    sleepDays += 1

# Run code, if necessary
if runningOn[currentDayOfWeek]:
    doWhatever()

# Sleep
sleep(sleepDays * 24 * 3600)
于 2012-06-04T16:20:15.570 回答