gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:36 25 4
gpt4 key购买 nike

我已经浏览了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com