gevent实现python并发api接口

2024-04-07 04:48

本文主要是介绍gevent实现python并发api接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

公司之前算法对外提供服务都是通过flask框架生成的api接口的形式,而最近项目中需要提高算法api接口的并发性能,通过分析flask对外api接口发现,该api接口是串行的方式,也即阻塞的形式进行数据处理的(前一条数据处理完成,才会进入下一条数据的处理)。因此,将flask提供api接口改为gevent,改用gevent后,算法接口在并发性能上提升效果明显,下面简要记录一下,做个笔记。

测试工具JMeter

本文采用jmeter测试工具对算法接口性能进行测试。JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。

JMeter的安装:https://blog.csdn.net/Jenny_He/article/details/88926605

利用JMeter测试基于flask接口和基于gevent接口的性能时,其线程组的设置如下图所示,设置100个线程(模拟100次接口调用), 准备时长(Ramp-Up)设置为1秒。

线程组各参数的含义可参考:https://blog.csdn.net/u012111923/article/details/80705141

算法接口参数设置如下图所示 

基于flask的api接口

测试代码如下

# -*- coding: utf-8 -*-
# @Time        : 2019/4/2 10:16
# @Author      : tianyunzqs
# @Description :import os
import sys
import logging as logger
import tracebackfrom flask import Flask, request, json
from flask_cors import CORSpackage_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(package_path)
from dev_v6.xj_common import text_extract_apiapp = Flask(__name__)
CORS(app)@app.route('/xj_hsyp_common', methods=['GET', 'POST'])
def api_xj_common():try:data = request.form['data']if data:logger.info("输入:")logger.info(str(data))result = {"success": "true", "result": text_extract_api(text=data)}else:result = {"success": "false", "result": "输入错误。"}logger.info("输出: ")logger.info(str(result))return json.dumps(result, ensure_ascii=False)except:logger.error(traceback.format_exc())return json.dumps({"success": "false", "result": "程序异常"}, ensure_ascii=False)if __name__ == '__main__':app.run(host='0.0.0.0', port=3009, threaded=True)

 jmeter测试产生的结果分析如下图所示

从上图可看出,基于flask的算法接口的吞吐量为1.3/sec,而且接口的处理方式阻塞型的 。

基于gevent的api接口

安装gevent

gevent是python的第三方库,提供了比较完善的对协程的支持。它用到Greenlet提供的,封装了libevent事件循环的高层同步API。它让开发者在不改变编程习惯的同时,用同步的方式写异步I/O的代码。

gevent的相关介绍:https://www.jianshu.com/p/861f29ac68e8

Windows安装

在线安装

pip install gevent

离线安装

从https://www.lfd.uci.edu/~gohlke/pythonlibs/下载以下whl文件,先安装gevent的几个依赖包(cffi、greenlet、pycparser),最后安装gevent,安装命令:

pip install *.whl

​Linux安装

在线安装

pip install gevent

离线安装

下载依赖包greenlet:

https://files.pythonhosted.org/packages/2e/65/27f35497cc0102a792390d056e793e064da95fc9eae45d75ae0ba49c0a0d/greenlet-0.4.15-cp35-cp35m-manylinux1_x86_64.whl

下载完成后运行:

pip install greenlet-0.4.15-cp35-cp35m-manylinux1_x86_64.whl

下载gevent:

https://files.pythonhosted.org/packages/95/d2/f2f454b00fde1608f6f4889c8cc3e12b5000f26cd5c3e11b5427c7781de9/gevent-1.4.0-cp35-cp35m-manylinux1_x86_64.whl

下载完成后运行:

pip install gevent-1.4.0-cp35-cp35m-manylinux1_x86_64.whl

 性能测试

测试代码:

# -*- coding: utf-8 -*-
# @Time        : 2019/4/2 10:16
# @Author      : tianyunzqs
# @Description :import os
import sys
import logging as logger
import traceback
import configparserfrom gevent import monkey
from gevent.pywsgi import WSGIServer
monkey.patch_all()
from flask import Flask, request, json
from flask_cors import CORSpackage_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(package_path)
from dev_v6.xj_common import text_extract_apiapp = Flask(__name__)
CORS(app)@app.route('/xj_hsyp_common', methods=['GET', 'POST'])
def api_xj_common():try:data = request.form['data']if data:logger.info("输入:")logger.info(str(data))result = {"success": "true", "result": text_extract_api(text=data)}else:result = {"success": "false", "result": "输入错误。"}logger.info("输出: ")logger.info(str(result))return json.dumps(result, ensure_ascii=False)except:logger.error(traceback.format_exc())return json.dumps({"success": "false", "result": "程序异常"}, ensure_ascii=False)if __name__ == '__main__':http_server = WSGIServer(('', 3009)), app)http_server.serve_forever()

 jmeter测试产生的结果分析如下图所示 

 

从上图可看出,接口的吞吐量提升到了2.9/sec,而且接口的处理方式非阻塞型的。

对比测试结果发现,使用gevent后接口的性能明显提升;而且接口由原来的串行方式变为并行方式,真正提高了接口的并发处理能力。

这篇关于gevent实现python并发api接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881667

相关文章

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求