猿创征文|python gevent 执行MySQLdb/mysqlclient连接卡住解决方案

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 猿创征文|python gevent 执行MySQLdb/mysqlclient连接卡住解决方案

一、前言


为了提高Django的并发性能,所以使用gunicorn+gevent组合来启动Django,但在过程中遇到了一个问题,之前能正常使用的接口按新方法部署后一直在报超时,后面排查发现当项目代码执行到使用Mysqlclient创建数据库连接时就会卡住。


网上找了一圈发现了一个解决方案:

ff756b37bc3b4b4f833b70f51bea3fbb.png

但使用时会报错,方法不好使,后面查阅pymysql的github:https://github.com/PyMySQL/mysqlclient/pull/285发现作者移除了上述的方法:

6c9266f3c04e452bbc5b0ea47b81ea3d.png


移除的原因作者也做了解释:

1b9b2b0056544c5e9b64a25c88d4b855.png



一句话概括:waiter不能完全解决gevent阻塞的问题,所以对此建议使用pymysql。


二、解决方案


因此我只好将代码中的所有mysqldb连接替换为了pymysql连接的方式,得以解决问题:


import pymysql
from pymysql.cursors import DictCursor
db_con = pymysql.connect(......).cursor()

可能还有其他的三方库或方案来解决此问题,但由于改动成本的原因还是选择了替换为pymysql。


三、pymysql和Mysqlclient区别


PyMySQL和Mysqlclient提供相同的功能——它们都是数据库连接器。

区别在于Mysqlclient是C扩展,PyMySQL是纯Python的实现,由此可以看出Mysqlclient的性能会由于PyMySQL,但由于Mysqlclient不支持gevent,所以在涉及到需要使用gevent时,还是得使用PyMySQL。


四、为什么要使用gunicorn+gevent


由于Python全局解释器锁的存在,Python的多线程更像是一种伪多线程,甚至就几乎等于Python是个单线程的程序。

所以在使用多线程时回发现CPU并不会被打满,因为在同一时刻,Python只会有一个线程在运行。所以为了提高Django的并发性能,需要采用多进程的方式来弥补这个问题,gunicorn是基于unix系统的一个 Python 的 WSGI HTTP 服务器,使用它可以很方便的管理我们的后端服务,它也兼容很多其他的框架。


另外使用gevent能更好对性能提升,gevent是python的一个并发框架,以协程(微线程)greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效,Gevent 通过 Cython 调用 libev 来实现一个高效的 event loop 调度循环。同时类似于 Event,Gevent 也有自己的 monkey_patch,在打了补丁后,完全可以使用 python 线程的方式来无感知的使用协程,减少了开发成本:

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
19天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
116 68
|
30天前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
256 3
|
1月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
263 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
12天前
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
48 0
|
29天前
|
SQL Oracle 关系型数据库
Python连接Oracle
Python连接Oracle
16 0
|
29天前
|
Python
python中3种获取cookie解决方案
python中3种获取cookie解决方案
18 0
|
2月前
|
前端开发 Python
前后端分离的进化:Python Web项目中的WebSocket实时通信解决方案
在现代Web开发领域,前后端分离已成为一种主流架构模式,它促进了开发效率、提升了应用的可维护性和可扩展性。随着实时数据交互需求的日益增长,WebSocket作为一种在单个长连接上进行全双工通讯的协议,成为了实现前后端实时通信的理想选择。在Python Web项目中,结合Flask框架与Flask-SocketIO库,我们可以轻松实现WebSocket的实时通信功能。
55 2
|
2月前
|
NoSQL Linux Redis
linux安装单机版redis详细步骤,及python连接redis案例
这篇文章提供了在Linux系统中安装单机版Redis的详细步骤,并展示了如何配置Redis为systemctl启动,以及使用Python连接Redis进行数据操作的案例。
66 2
|
2月前
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
72 1
|
1月前
|
Android开发 Swift iOS开发
python 基于电脑蓝牙连接获取手机的实时数据
python 基于电脑蓝牙连接获取手机的实时数据
52 0