【问题标题】:python time.sleep takes longer than expected (multi threaded)python time.sleep 花费的时间比预期的要长(多线程)
【发布时间】:2017-06-29 18:22:29
【问题描述】:

我已经浏览了time.sleep()hang/delays 上的相关主题,但还没有找到答案。因此,将问题与我看到的问题一起发布。

我无权访问完整的代码。这是我可以访问并看到问题的代码 sn-p:

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 秒。

我正在寻找可能导致这种行为的原因/场景。

任何帮助/指针将不胜感激。

【问题讨论】:

    标签: python multithreading python-2.7 sleep


    【解决方案1】:

    这个虚构的例子可以重现你的结果。 另一个线程在计算和打印之间更改了全局sleep_time。没有锁定:

    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)
    

    thread.log的内容:

    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
    

    请注意,我将等待格式化为浮点数,以避免在输出中损失近一秒。

    【讨论】:

    • 该代码已经执行。如果您查看日志,则两条日志行是连续的(循环的最后一行和循环的第二行),中间有一个睡眠。
    • 能否再添加几行日志文件。
    • 我现在没有它(正如我提到的,我的访问权限有限)。我正在尝试收集更多详细信息。
    • 想出了一个重现你的日志文件的例子。
    • 谢谢迈克。就我而言,虽然没有全局变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多