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

目录

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值