【问题标题】:timeout for 10 seconds while loop in python在python中循环超时10秒
【发布时间】:2017-11-08 07:14:42
【问题描述】:

在 python 中,while 循环超时的最佳方法是什么

说:

while not buff.endswith('/abc #'):

10 秒后,如果不匹配,则中断循环。

谢谢

【问题讨论】:

  • 请更清楚地说明问题。你想在 10 秒后打破while 循环吗?
  • 我很惊讶没有人建议使用某种sleep 来防止代码阻塞其他线程。 buf 是异步填充的吗?

标签: python python-2.7


【解决方案1】:

可以记录循环前的时间,然后在while循环内比较当前时间,如果大于10秒,可以break退出while循环。

类似:

from datetime import datetime

start_time = datetime.now()
print(start_time)

while not buff.endswith('/abc #'):
    print('waiting')
    time_delta = datetime.now() - start_time
    print(time_delta)
    if time_delta.total_seconds() >= 10:
        break

【讨论】:

  • 不应该是time_delta.total_seconds()而不是time_delta.seconds吗?见:stackoverflow.com/a/17191361/5815327
  • @Deantwo - 两者在这里的工作方式相同。您所指的答案是在不同的上下文中,其中seconds 是可能有很多分钟和小时的时间的秒值。在这里,total_secondsseconds 都是从 0 开始的时间,因此返回相同的值(因为我们在 10 秒后中断,所以不可能有分钟或小时)。
  • 如果你相信你可以可靠地说你的代码永远不会被用来进行超过 59 秒的超时,那没关系。似乎是一个等待发生的问题。
  • 这是有道理的@Deantwo - 如果维护代码的人想要将10 更改为> 59,那么这确实是一个问题。 seconds 仅在此上下文 (total_seconds() 对于任何超时值都有效。
【解决方案2】:

如果您唯一关心的是在 10 秒后结束循环,请尝试以下代码。

from datetime import datetime 
t1 = datetime.now()
while (datetime.now()-t1).seconds <= 10:
  #do something
  print(datetime.now())

否则检查循环内的时间差并将其中断。喜欢,

t1 = datetime.now()  
while not buff.endswith('/abc #'):
  if (datetime.now()-t1).seconds > 10:
    break

【讨论】:

【解决方案3】:

您可以使用interrupting cow package 并将您的代码放在with 管理语句中。

import interruptingcow
TIME_WAIT=20 #time in seconds

class TimeOutError(Exception):
    """InterruptingCow exceptions cause by timeout"""
    pass

with interruptingcow.timeout(TIME_WAIT, exception=TimeOutError):
    while not buff.endswith('/abc #'):
        pass #do something or just pass

只要您不将 interruptingcow 与其他实现 SIGALARM 的系统一起使用,例如。 stopitpython-rq。它会工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2017-10-19
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多