【问题标题】:Upper limit in Python time.sleep()?Python time.sleep() 的上限?
【发布时间】:2010-12-28 19:26:51
【问题描述】:

你可以用 time.sleep() 指定一个线程休眠多长时间有上限吗?我的脚本长时间休眠(即超过 1k 秒)时遇到问题。此问题已在 Windows 和 Unix 平台上出现。

【问题讨论】:

  • 是的,有一个上限:当有人绊倒您机器的电源线时;-)
  • 你有什么“问题”?具体一点。
  • 我的猜测是它是特定于平台的,但我没有足够的知识来证明任何事情。

标签: python time limit sleep


【解决方案1】:

其他人已经解释了为什么您的睡眠时间可能比您要求的要少,但没有告诉您如何处理这个问题。如果您需要确保至少睡眠 n 秒,您可以使用如下代码:

from time import time, sleep
def trusty_sleep(n):
    start = time()
    while (time() - start < n):
        sleep(n - (time() - start))

这可能睡眠超过 n,但在至少睡眠 n 秒之前它永远不会返回。

【讨论】:

  • +1 表示没有犯同样的错误@mykhal,在这种错误中,小幅度睡眠的累积效应会累积起来,导致总睡眠量明显超过预期。
【解决方案2】:

我想时间越长越有可能situation described in the docs

实际挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长。

【讨论】:

  • 复制和粘贴的奇迹......(见eliben的回答)。但是,+1 用于包含带有链接的来源。
  • @Boldewyn:只是因为我的 Firefox 冻结了,所以我比 eli 晚了 3 秒。
  • @Boldewyn:不过,我们确实提供了不同的评估。
  • 除了可能的等待时间之外,似乎还有一个硬性限制,版本不同。
【解决方案3】:

实际答案,至少对于我的机器: 4294967.2950000003911900999...秒。

sleep(4294967.2950000003911901)

溢出错误:睡眠长度过大

【讨论】:

  • 你是怎么得到那个号码的?
  • 你是个谜先生
  • @Matt 有趣!
  • 阈值对我来说在 Windows 10 上看起来是一样的。
  • 有趣的是,我用我的 ipad 测试了 Repl.it Python 编译器,但它似乎有更大的限制。
【解决方案4】:

This changed in version 3.5:

time.sleep(*secs*): 该函数现在睡眠至少 secs,即使 睡眠被信号中断,除非信号处理程序引发 一个例外(请参阅PEP 475 了解基本原理)

【讨论】:

    【解决方案5】:

    根据文档,time.sleep 接受任何非零数字 [1],您可能知道。但是,您也受到操作系统调度程序的影响 [1]。

    [1]http://docs.python.org/library/time.html

    【讨论】:

    • 抱歉,发帖前没有看到其他答案。
    【解决方案6】:

    您可以通过将短延迟睡眠放入循环中来防止可能出现的问题:

    def sleep(n):
        for i in xrange(n):
            time.sleep(1)
    

    【讨论】:

    • 这有点好,但如果 sleep() 调用被提前中断,它仍然可能睡眠少于 n。
    • 好吧,在这种情况下,我将函数更改为:t0 = time.time();而 time.time()
    【解决方案7】:

    我也遇到过不得不质疑自己的情况。就我而言,我的线程需要长时间(几天,几个月)睡觉。正如matt 回答的一个有趣的事实,即有一个限制。在他和我的系统中,限制是4.29Million secs +,不同的系统有不同的限制,因为有人在垫子上回答的评论说 Repl.it 有更大的限制。

    所以无论如何,毕竟我们仅限于它,但我找到了一个解决方案,即使用max_sleep_secs 将秒分成块,然后循环遍历该块列表并休眠。

    import time
    
    
    def sweet_dreams(secs: float):
        DEBUG = False
        max_sleep_secs = 1000000
        secs_extra_ms = 0
    
        if secs > max_sleep_secs:
            if type(secs) is float:
                secs_extra_ms = str(secs).split('.')[-1]
                if secs_extra_ms:
                    secs_extra_ms = secs_extra_ms.lstrip('0')
    
                secs_extra_ms = float(f"0.{secs_extra_ms}")
    
            secs = int(secs)
            secs_divide = float(secs) / max_sleep_secs  # e.g: 2.4123
            secs_int = int(secs_divide)  # e.g: 2
            secs_decimal_remainder = int(str(secs_divide).split(".")[-1])  # e.g 4123
            chunks = [max_sleep_secs for _ in range(secs_int)]
            if secs_decimal_remainder:
                chunks.append(int(str(secs_decimal_remainder).lstrip('0')))
    
            if secs_extra_ms:
                chunks.append(secs_extra_ms)
    
            if DEBUG:
                print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: {chunks}")
                quit()
    
            for seconds in chunks:
                time.sleep(seconds)
        else:
            if DEBUG:
                print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: None")
                quit()
    
            time.sleep(secs)
    

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      相关资源
      最近更新 更多