python time.sleep 花费的时间比预期的要长(多线程)

标签 python multithreading python-2.7 sleep

我已经浏览了 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 循环在主线程中执行。 time.sleep 应该休眠 4 秒,但最终等待了 18 秒。

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

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

最佳答案

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

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

请注意,我将等待格式设置为 float ,以避免在输出中丢失近一秒。

关于python time.sleep 花费的时间比预期的要长(多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42175714/

相关文章:

python - 如果在 for 循环中,如何在单行中使用 "continue"

c# - .NET 线程中的中止和中断之间的区别

python - PyQt QWebPage linkClicked 信号可以检测使用了哪个鼠标按钮

python - 通过将变量传递给具有 yield 的递归函数来查找最小值

python - 来自稀疏对角 block 的稀疏对角矩阵

python - 无法在 centos 7 中为 python 设置 SonarQube

Java 内存模型和并发

c++ - Boost线程和FFmpeg : Such simple code gives me error C2064. 我做错了什么呀?

python - 直接从终端运行已安装的 python 模块

python - 如何在虚拟环境中安装python "gi"模块?