一个Python递归调用深度的问题

在复杂的自动化测试脚本中,使用eventlet进行超时处理可能导致递归深度超出限制的问题。当模块调用复杂且资源创建时间较长时,会出现`RuntimeError: maximum recursion depth exceeded`。解决方法包括重写超时逻辑,避免使用eventlet的Timeout,或者回退eventlet版本。文中提供了简单的超时重写示例,并建议根据具体环境和需求选择合适的方法。
摘要由CSDN通过智能技术生成

目录

1.背景

2.问题重现

3.问题解决

1)重写超时

2)对eventlet回退版本

4.参考资料


1.背景

在略微复杂一些的自动化测试脚本中,都会使用“超时”处理。因为采用eventlet进行超时处理,所以有了这一次的经验教训。代码是网上抄的,问题是自己找的。。。

2.问题重现

使用了网上一段超时代码,出处已经无从知晓了,在此向作者抱个歉了~~

import time
import eventlet

TIMEOUT=100

eventlet.monkey_patch()
try:
    with eventlet.Timeout(TIMEOUT):
        while True:
            act = foo(param1, param2)
            if act == exp:
                return True
            time.sleep(5)
except eventlet.timeout.Timeout:
    print('程序运行超时!')

在超时时间较短,模块调用不复杂的情况下,代码不会有出现问题。只是在自己用的自动化框架中,模块较多,调用关系复杂,加之创建资源等待时间较长(超过3min。这个是产品自身属性)。所以出现了,单个用例运行正常,多个用例一起执行时就会抛出如下异常:

RuntimeError: maximum recursion depth exceeded

超过递归调用深度。虽然可以手动临时修改,但毕竟不能从根本上解决问题。

3.问题解决

1)重写超时

简单但没有再出错的代码:

TIMEOUT = 100

def timeout_func(TIMEOUT, act, exp):
    cnt = 1
    while cnt <= TIMEOUT:
        if act == exp:
            break
        time.sleep(5)
        cnt = cnt + 1
    if cnt > TIMEOUT:
        raise Exception(f"超时了~~")

2)对eventlet回退版本

这个如参考资料所示。但由于Python版本非资料中说的3.6,所以这个方法没有考虑。留给各位看官实践吧~~

4.参考资料

Bug #1788253 “SSLContext infinite recursion in Python 3.6 " : Bugs : OpenStack Shared File Systems Service (Manila)

https://github.com/eventlet/eventlet/issues/371 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值