1

毎日 09:00 に起きて、いくつかのソースからデータをフェッチする小さなアプリを書いています。しかし、ログとデータベース エントリを確認すると、これが 09:00 と 10:00 に実行されていることがわかります。

スクレイピングプロセスが完了するまでにせいぜい15分しかかかりません.これは私を完全に困惑させます.

while 1:

    if time.strftime("%H") == "09" and time.strftime("%M") == "00":
        print "Starting at: " + time.strftime("%H") + ":" + time.strftime("%M")
        worker1.startThread()
        worker2.startThread()

    time.sleep(30)

私のログでは、私は本質的に見ています

Starting at: 09:00
     <snip>
Starting at: 10:00
4

3 に答える 3

3

このシナリオはどうですか:

while 1:                               # 09:59:59.97 

    if time.strftime("%H") == "09"     # 09:59:59.99  
    and time.strftime("%M") == "00":   # 10:00:00.01

これが起こるには運が必要ですが、誰が知っていますか:-)


ところでtime.sleep(30)、09:00 にループに 2 回入る可能性が高いことを意味します。しかし、それが私たちが議論している問題にどのように関連しているのかわかりません.

于 2013-04-30T20:31:10.217 に答える
2

わかりやすくするために、この回答でいくつかの提案をまとめます。まず、私の推測では、この問題は実際には Kos が説明しているものであり、予想よりも頻繁に発生していると思います。を 2 回呼び出すtime.strftime(実際には 4 回、そのうちの 2 回は印刷用です) ということは、内部で を 2 回 (4 回) 呼び出していることを意味しtime.localtime、30 秒ごとにチェックしているため、正確な分に非常に近い場合、妥当な頻度で 10:00 時間にまたがる値になります。これは私がそれを修正する方法です:

while True:
    t = time.localtime()
    if t[3:5] == (9, 0): # Compare (hour, day) numerically
        print time.strftime("Starting at: %H:%M", t)
        worker1.startThread()
        worker2.startThread()
        time.sleep(get_nap_length())
    else:
        time.sleep(59) # No need to sleep less than this, even being paranoid.

def get_nap_length():
    '''Returns approximate number of seconds before 9:00am tomorrow.

    Probably implementing this would be easiest with the datetime module.'''

get_nap_length実装は気が向いたら任せます。安全のために、明日の午前8時58分までの秒数のようなものを返すようにします。これを実装すると、ループを通過する「無駄な」回数が減るため、何らかの形で失火する可能性が減ります。これを実装しない場合elseは、上記で提供したコードからworker1も削除する必要があることに注意してくださいworker2

最後に、システム スケジューラに注目することは間違いなく価値があります。なぜなら、人々が言っ​​ているように、OS に処理を任せたほうがよいからです。Windows では、ネイティブ機能 (管理ツールの下のタスク スケジューラ) により、スケジュールされたタスクがかなり簡単になります。*nix についてはわかりませんが、それほど悪くはないと思います。

于 2013-04-30T22:02:23.343 に答える
0

次のように @Kos によって提案された問題を除外できます。

while 1:

    now = time.localtime()
    hour = time.strftime("%H", now)
    min = time.strftime("%M", now)
    if hour == "09" and min == "00":
        print "Starting at: " + hour + ":" + min
        worker1.startThread()
        worker2.startThread()

    time.sleep(30)

このようにして、移動するターゲットで strftime() を実行していません。

于 2013-04-30T21:10:12.360 に答える