如何为不是函数python3的代码块设置超时

时间:2019-02-14 11:08:33

标签: python-3.x timeout

花了很多时间在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循环未正确完成。

2 个答案:

答案 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秒,具体取决于单步执行时间。