2017-02-11 5 views
1

time.sleep()関連スレッドを終了しましたが、まだ応答が見つかりませんでした。したがって、私は見ている問題で質問を投稿します。python time.sleepが予想以上に時間がかかります(マルチスレッド)

私は完全なコードにアクセスすることはできません。

def my_debug(self, msg): 
    logging.debug(msg, extra={'threadname':threading.currentThread().name}) 

while True: 
    next = time.time() + INTERVAL # INTERVAL = 5 
    my_debug("Triggering event") 
    # some code 
    # some more code 
    sleep_time = max(next - time.time(), 0) 
    my_debug("Sleeping for %d sec" % sleep_time) 
    time.sleep(sleep_time) 

これが生成します:

2017-01-11 00:08:03 DEBUG MainThread Sleeping for 4 sec 
2017-01-11 00:08:21 DEBUG MainThread Triggering event 

はどうやら、他のスレッドがあるとwhileループがMainThreadに実行ここで私はへのアクセスをしたし、問題を見ていたコードの抜粋です。 time.sleepは4秒間スリープするはずですが、18秒間待つことになります。

この現象を引き起こす可能性がある理由とシナリオを探しています。

本当にありがとうございます。

答えて

1

この作成された例は、結果を再現できます。 別のスレッドは、グローバルsleep_timeを計算して印刷する間だけ変更します。 thread.log

import logging 
import time 
import threading 


INTERVAL = 5 

logging.basicConfig(filename='thread.log',level=logging.DEBUG, 
        format='%(asctime)s %(message)s') 

def my_debug(msg): 
    logging.debug(msg, extra={'threadname':threading.currentThread().name}) 


class Changer(threading.Thread): 

    def run(self): 
     global sleep_time 
     while True: 
      sleep_time = 18 


changer = Changer() 
changer.start() 


while True: 
    next = time.time() + INTERVAL # INTERVAL = 5 
    my_debug("Triggering event") 
    # some code 
    # some more code 
    sleep_time = max(next - time.time(), 0) 
    my_debug("Sleeping for %f sec" % sleep_time) 
    time.sleep(sleep_time) 

内容::私は出力で約1秒を失うことを避けるために、floatとして待機をフォーマット

2017-02-11 19:45:14,700 Triggering event 
2017-02-11 19:45:14,701 Sleeping for 4.999720 sec 
2017-02-11 19:45:32,705 Triggering event 
2017-02-11 19:45:32,705 Sleeping for 4.999525 sec 
2017-02-11 19:45:50,710 Triggering event 
2017-02-11 19:45:50,710 Sleeping for 4.999726 sec 
2017-02-11 19:46:08,714 Triggering event 
2017-02-11 19:46:08,716 Sleeping for 4.997533 sec 
2017-02-11 19:46:26,720 Triggering event 
2017-02-11 19:46:26,725 Sleeping for 4.995042 sec 
2017-02-11 19:46:44,730 Triggering event 
2017-02-11 19:46:44,731 Sleeping for 4.999471 sec 
2017-02-11 19:46:49,730 Triggering event 
2017-02-11 19:46:49,731 Sleeping for 4.999794 sec 
2017-02-11 19:47:07,736 Triggering event 
2017-02-11 19:47:07,736 Sleeping for 4.999609 sec 
2017-02-11 19:47:25,739 Triggering event 
2017-02-11 19:47:25,739 Sleeping for 4.999751 sec 

注一切ロックはありません。

+0

そのコードはすでに実行されています。ログを見ると、2つのログ行は連続しており(最後の行の行と2番目の行の行)、その間に睡眠があります。 – Sharad

+0

ログファイルをいくつか追加できますか? –

+0

私は現時点でそれを持っていません(私はアクセスが制限されていると言いました)。私はいくつかの詳細を集めようとしています。 – Sharad

関連する問題