【问题标题】:Python loop to run for certain amount of secondsPython循环运行一定的秒数
【发布时间】:2014-08-14 00:09:30
【问题描述】:

我有一个 while 循环,我希望它持续运行 15 分钟。目前是:

while True:
    #blah blah blah

(这会运行,然后重新启动。我需要它继续执行此操作,除非 15 分钟后退出循环)

谢谢!

【问题讨论】:

    标签: python time timer while-loop


    【解决方案1】:

    对于那些使用 asyncio 的人,一个简单的方法是使用asyncio.wait_for()

    async def my_loop():
        res = False
        while not res:
            res = await do_something()
    
    await asyncio.wait_for(my_loop(), 10)
    

    【讨论】:

      【解决方案2】:

      当我在这里遇到这个问题时,我正在寻找一个更易于阅读的时间循环。比如:

      for sec in max_seconds(10):
            do_something()
      

      所以我创建了这个助手:

      # allow easy time-boxing: 'for sec in max_seconds(42): do_something()'
      def max_seconds(max_seconds, *, interval=1):
          interval = int(interval)
          start_time = time.time()
          end_time = start_time + max_seconds
          yield 0
          while time.time() < end_time:
              if interval > 0:
                  next_time = start_time
                  while next_time < time.time():
                      next_time += interval
                  time.sleep(int(round(next_time - time.time())))
              yield int(round(time.time() - start_time))
              if int(round(time.time() + interval)) > int(round(end_time)): 
                  return
      

      它只适用于整秒,这对我的用例来说是可以的。

      例子:

      for sec in max_seconds(10) # -> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
      for sec in max_seconds(10, interval=3) # -> 0, 3, 6, 9
      for sec in max_seconds(7): sleep(1.5) # -> 0, 2, 4, 6
      for sec in max_seconds(8): sleep(1.5) # -> 0, 2, 4, 6, 8
      

      请注意,间隔不是那么准确,因为我只等待整秒(睡眠时间小于 1 秒对我没有任何好处)。因此,如果您的工作需要 500 毫秒并且您要求 1 秒的间隔,您将在以下时间被调用:0、500 毫秒、2000 毫秒、2500 毫秒、4000 毫秒等等。可以通过在循环中测量时间而不是 sleep() 来解决这个问题 ...

      【讨论】:

        【解决方案3】:

        你可以做到的

        import time
        delay=60*15    ###for 15 minutes delay 
        close_time=time.time()+delay
        while True:
              ##bla bla
              ###bla bla
             if time.time()>close_time
                 break
        

        【讨论】:

        • 或者更简单的while close_time&gt;time.time():,不需要if time.time()&gt;close_time: break...
        【解决方案4】:

        试试这个:

        import time
        import os
        
        n = 0
        for x in range(10): #enter your value here
            print(n)
            time.sleep(1) #to wait a second
            os.system('cls') #to clear previous number
                             #use ('clear') if you are using linux or mac!
            n = n + 1
        

        【讨论】:

          【解决方案5】:

          如果我理解你,你可以用datetime.timedelta 来做 -

          import datetime
          
          endTime = datetime.datetime.now() + datetime.timedelta(minutes=15)
          while True:
            if datetime.datetime.now() >= endTime:
              break
            # Blah
            # Blah
          

          【讨论】:

          • 谢谢它的工作,但我使用 DrV 的答案只是因为它对我更有意义。
          • @Elliott,你有什么理由不直接在 while 语句中使用 now()
          • @Bob 配合 OP 的问题。
          【解决方案6】:

          试试这个:

          import time
          
          t_end = time.time() + 60 * 15
          while time.time() < t_end:
              # do whatever you do
          

          这将运行 15 分钟 x 60 秒 = 900 秒。

          函数time.time 返回自 1970 年 1 月 1 日以来的当前时间(以秒为单位)。该值是浮点数,因此您甚至可以以亚秒级精度使用它。一开始,t_end 的值被计算为“现在”+ 15 分钟。循环将一直运行,直到当前时间超过这个预设的结束时间。

          【讨论】:

          • 谢谢,我最初只用了 60 秒测试了它,但它停止了,所以我知道 15 分钟也可以。
          • 另一个问题:下面的语法有效吗? if keys[pygame.K_LEFT]: answer = "left" f = open("answer.rtf", "a") f.write(answer) f.close() 之后它不会让我打开文本文件,我想知道是我做错了什么还是我的电脑出了问题。
          • 从 SO cmets 中发现代码中的轻微语法错误非常困难,所以也许您应该创建另一个问题。但是,至少if操作是错误的,应该有==而不是=,冒号应该在“left”之后。如果您无法通过合理的努力使其工作,请发布另一个问题。 (只要确保你没有对缩进做错任何事情。)
          • @oam811:在 Python 3 上使用 time.monotonic(),以避免由于机器时钟调整导致的意外延迟(time.time() 可以设置回)。
          • 如果由于时间限制而必须跳过循环,有没有办法让它通知我?
          猜你喜欢
          • 1970-01-01
          • 2022-10-14
          • 2023-03-11
          • 2014-06-13
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 2019-03-06
          相关资源
          最近更新 更多