python超时处理方法eventlet的eventlet.Timeout

Posted z天赐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python超时处理方法eventlet的eventlet.Timeout相关的知识,希望对你有一定的参考价值。

一、前言

在使用python进行接口自动化测试、脚本编写、执行sql的时候,如果遇到以下问题的,都可以用eventlet.timeout这个方法。

  1. 执行下载数据的接口,数据量较大导致后面接口一直等待;
  2. 执行sql,sql数据因外界原因导致数据一直加载没查询出来;
  3. 编写抢票脚本,抢第一个条数据的时候,因接口并发较大,导致接口一直加载,没办法循环抢购其他数据;
  4. 有requests请求多久不反回结果,就跳过的场景;
  5. 有的场景指定时间反回才算有效的;
  6. 爬虫的时候,爬到某个数据,导致数据很久没返回,程序需要一直等待,没办法往下执行。

 

以上场景中,我们可以利用eventlet.timeout这个方法进行跳过,能提高我们的代码可靠性,健壮性。

 

 

二、使用方法

2.1、安装

安装: pip install eventlet

 

2.2、代码中引用

import eventlet

2.3、代码中使用

使用方法:在你觉得可能会超时的代码外层,使用下with eventlet.Timeout(3秒,False):

当with eventlet.Timeout(3秒,False): 下的代码执行超过3秒了,则直接跳过,如果3s内执行完了,则忽略

import time
import eventlet
eventlet.monkey_patch()  #必须要加这段代码,引用下path


#场景一:超时跳过
with eventlet.Timeout(3, False):    # 等待3秒,如果3秒内第8-9行代码执行没有执行完,则跳过,直接去执行第10行
    time.sleep(4)                   # 等待4秒
    print(\'结果1\')                   # 因为等待了4秒,大于超时时间,所以’结果1‘不打印

print(\'结果2\')



#场景2:没有超时
with eventlet.Timeout(3, False):    # 等待3秒,如果3秒内第17-18行代码执行没有执行完,则跳过,直接去执行第10行
    time.sleep(2)                   # 等待2秒
    print(\'结果3\')                   # 因为等待了2秒,小于超时时间,所以’结果3‘也会打印
print(\'结果4\')

 

2.4 根据2.3代码执行的结果分析

#执行结果

结果2
结果3
结果4

 

场景1:结果1没有执行是因为eventlet.Timeout(3,False)设置的是3秒超时,他下面的代码sleep了4秒,直接跳过,输出了结果2

场景2:因为eventlet.Timeout(3,False)设置的是3秒超时,他下面的代码sleep了2秒,那么结果3、4都输出了

 

以上是关于python超时处理方法eventlet的eventlet.Timeout的主要内容,如果未能解决你的问题,请参考以下文章

Python 超时(运行时间太长) 结束进程

flask-SocketIO 和 eventlet 有问题

对Gunicorn文档的学习

Python eventlet

如何组合多处理和eventlet

Python/Erlang:Twisted、Stackless、Greenlet、Eventlet、协程有啥区别?它们是不是类似于 Erlang 进程?