Python 函数限时运行

最近碰到需求,希望能限制函数运行的时间,若限定时间内函数未运行完,则结束此次执行,重新开始下一次执行,直到限定时间内能正常运行完为止。
因为是在windows上运行,网上看到的很多用的信号量的办法解决,但是无法适用于win系统
经过多次查找,发现可以使用 eventlet 包完成该需求!

安装所需的包——eventlet

pip install eventlet

导包注意

import eventlet  # 导入eventlet模块

eventlet.monkey_patch()  # 添加猴子补丁

因为本人也对猴子补丁一知半解,所以在这里就不过多解释误导大家了

使用

import time
import random
import eventlet  # 导入eventlet这个模块

eventlet.monkey_patch() # 添加猴子补丁


# 将功能写成装饰器,若限定时间正常运行完,则返回Ture;反之返回False
def is_timeout(time_num): # 设置超时时间为 time_num
    def wrap(func):
        def inner(*args, **kwargs):
            try:
                with eventlet.Timeout(time_num, True):
                    func(*args, **kwargs)
                return True
            except eventlet.timeout.Timeout:
                return False

        return inner

    return wrap


@is_timeout(4) # 在这里设置限定时间为 4 秒
def res():
    t = random.choice([1, 2, 8, 9, 10])
    print('t时间', t)
    time.sleep(t)
    print('我被执行了') # 当函数未超时,会正常运行到这里,否则函数会运行到第4秒时终止,即不会运行到这一步


if __name__ == '__main__':
    while True: # 循环调用函数,直到限定时间内运行完函数为止(可根据实际需求更改代码)
    	if is_true:
            print('成功')
            print('-' * 20)
            break
        else:
            print('超时')
            print('-' * 20)

运行结果

t时间 8
超时
--------------------
t时间 10
超时
--------------------
t时间 2
我被执行了
成功
--------------------

可以看到,当运行时间为 810 秒时,是不会运行到 print(‘我被执行了’) 这一步的,但是运行时间为 2 秒时,会运行完整个过程


版权声明:本文为weixin_43868038原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。