花了很多时间在stackoverflow中寻找解决方案之后,我找不到为代码块设置超时的好方法。有一些近似值可以设置函数的超时时间。不过,我想知道如何在没有功能的情况下设置超时。让我们以以下代码为例:
print("Doing different things")
for i in range(0,10)
# Doing some heavy stuff
print("Done. Continue with the following code")
那么,如果x秒钟后仍未完成,您将如何中断for循环?只需继续执行代码(也许保存一些bool变量即可知道已达到超时),尽管for循环未正确完成。
答案 0 :(得分:1)
我认为在不使用功能的情况下有效地实现了这一点,请看下面的代码..
import datetime as dt
print("Doing different things")
# store
time_out_after = dt.timedelta(seconds=60)
start_time = dt.datetime.now()
for i in range(10):
if dt.datetime.now() > time_started + time_out:
break
else:
# Doing some heavy stuff
print("Done. Continue with the following code")
问题:超时将在每个循环周期的开始进行检查,因此可能要花费超过指定超时时间的循环中断,或者在最坏的情况下,它可能不会中断循环,因为它可以做到这一点。中断无法完成迭代的代码。
更新:
正如op所说,他想要一种更有效的方法,这是一种正确的方法,但是要使用函数。
import asyncio
async def test_func():
print('doing thing here , it will take long time')
await asyncio.sleep(3600) # this will emulate heaven task with actual Sleep for one hour
return 'yay!' # this will not executed as the timeout will occur early
async def main():
# Wait for at most 1 second
try:
result = await asyncio.wait_for(test_func(), timeout=1.0) # call your function with specific timeout
# do something with the result
except asyncio.TimeoutError:
# when time out happen program will break from the test function and execute code here
print('timeout!')
print('lets continue to do other things')
asyncio.run(main())
预期输出:
doing thing here , it will take long time
timeout!
lets continue to do other things
注释:
现在超时将在您指定的时间之后发生。在此示例代码中,一秒钟后。
您将替换以下行:
await asyncio.sleep(3600)
带有您的实际任务代码。
尝试一下,让我知道您的想法。谢谢。
阅读asyncio文档: link
更新24/2/2019
如前所述,asyncio.run在python 3.7中引入,并要求在python 3.6上进行替代
asyncio.run替代3.7之前的python的版本:
替换
asyncio.run(main())
此代码适用于旧版本(我认为是3.4到3.6)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
答案 1 :(得分:0)
您可以尝试以下方式:
import time
start = time.time()
for val in range(10):
# some heavy stuff
time.sleep(.5)
if time.time() - start > 3: # 3 is timeout in seconds
print('loop stopped at', val)
break # stop the loop, or sys.exit() to stop the script
else:
print('successfully completed')
我认为这是一种可行的方法。实际超时时间大于3秒,具体取决于单步执行时间。