0

特定の曜日を実行するように割り当てたプロジェクトがありますが、含まれていない他の日はスキップする必要があります。例えば:

曜日:月(0)、火(1)、水(2)、木(3)、金(4)休日:土(5)、日(6)

何日もレジストリ内に設定を保存していますが、設定がプルされると、平日の番号で参照されます。

アプリを金曜日(4)にスリープ状態にし、月曜日(0)にウェイクアップさせたい場合、どうすればよいですか?休日が一貫しているかどうかを確認する方法はありません。土曜日/日曜日の代わりに日曜日/月曜日が休みになる可能性があります。

理想的には、現在の平日の数値を調べて、それが日のリストに含まれているかどうかを確認し、含まれていない場合は、翌日が始まるまでの秒数を計算する必要があります。

シナリオ:

  1. スクリプトを6月8日金曜日にスリープ状態に設定し、土曜日と日曜日は休みの日ですが、月曜日11日に再開するように、この2日間のスリープ秒数を計算するにはどうすればよいですか。

  2. スクリプトを6月6日水曜日にスリープ状態に設定し、6月8日金曜日にスリープ解除する必要がありますが、金曜日の夜にオフに戻して、月曜日の朝に再開します。

日数は変動するため、この関数はそれに対応できる必要があります。それは私が私の問題にぶつかっているところです。

どんな助けでも大歓迎です、事前に大いに感謝します!

4

2 に答える 2

1

1 日 1 回確認してください。今日がオン日でない場合は、明日まで寝てください。

また

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 に答える