在python中循环时超时10秒

在python中循环时超时10秒,python,python-2.7,Python,Python 2.7,在python中,在循环时超时的最佳方法是什么 说: 10秒后,如果不匹配,则中断循环 谢谢您可以记录循环前的时间,然后在while循环内比较当前时间,如果时间>10秒,您可以中断退出while循环 比如: from datetime import datetime start_time = datetime.now() print(start_time) while not buff.endswith('/abc #'): print('waiting') time_del

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

说:

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


谢谢

您可以记录循环前的时间,然后在while循环内比较当前时间,如果时间>10秒,您可以
中断
退出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

您可以记录循环前的时间,然后在while循环内比较当前时间,如果时间>10秒,您可以
中断
退出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

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

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

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

from datetime import datetime 
t1 = datetime.now()
while (datetime.now()-t1).seconds <= 10:
  #do something
  print(datetime.now())
您可以使用管理语句将代码放入

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
的系统,例如
stopit
python rq
。它将起作用

您可以使用
管理声明将代码放入

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
的系统,例如
stopit
python rq
。它会起作用的

请让问题更加清晰。你想在10秒后中断
循环吗?我很惊讶没有人建议使用某种
睡眠来阻止代码阻塞其他线程。
buf
是异步填充的吗?请进一步澄清问题。你想在10秒后中断
循环吗?我很惊讶没有人建议使用某种
睡眠来阻止代码阻塞其他线程。
buf
是异步填充的吗?不应该是
(datetime.now()-t1).总秒数()
而不是
.seconds
?请参阅:这不应该是
(datetime.now()-t1).总秒数()而不是
.seconds
?请参阅:这不应该是
时间增量.总秒数()
而不是
时间增量.秒数
?请看:@Deantwo-两者在这里的作用相同。您所指的答案是在不同的上下文中,
seconds
是一个时间的秒值,可能有许多分钟和小时。这里,
total_seconds
seconds
都是从
0
开始的时间,因此返回相同的值(因为我们在10秒后中断,所以不可能有分钟或小时)。如果您相信您的代码永远不会被用于超时超过59秒,当然没关系。这似乎是一个有待解决的问题。这是有道理的@Deantwo-如果维护代码的人想要将
10
更改为>59,那么这确实是一个问题
seconds
仅在此上下文(<60)中有效,而
total_seconds()
对任何超时值都有效。这不应该是
time_delta.total_seconds()
而不是
time_delta.seconds
?请看:@Deantwo-两者在这里的作用相同。您所指的答案是在不同的上下文中,
seconds
是一个时间的秒值,可能有许多分钟和小时。这里,
total_seconds
seconds
都是从
0
开始的时间,因此返回相同的值(因为我们在10秒后中断,所以不可能有分钟或小时)。如果您相信您的代码永远不会被用于超时超过59秒,当然没关系。这似乎是一个有待解决的问题。这是有道理的@Deantwo-如果维护代码的人想要将
10
更改为>59,那么这确实是一个问题
seconds
仅在此上下文(<60)中有效,而
total_seconds()
对任何超时值都有效。