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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 猿创征文|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 线程的方式来无感知的使用协程,减少了开发成本:

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
网络协议 安全 Python
python中socket客户端关闭连接
【4月更文挑战第7天】本教程介绍了如何在TCP客户端中正确关闭连接。使用`close()`方法可关闭Socket连接并释放资源,示例代码显示了在正常和异常情况下关闭连接的方法。注意异常处理以确保在任何情况下都能关闭连接,并避免并发操作同一Socket,以保证连接的稳定和安全。掌握这些技巧对编写健壮的TCP客户端至关重要。
|
5天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
17 6
|
5天前
|
算法 Python
打造高效生产排程:Python在APS解决方案中的应用
打造高效生产排程:Python在APS解决方案中的应用
20 2
|
5天前
|
开发者 Python
【亮剑】Python中`List.append()`方法不起作用的原因及解决方案
【4月更文挑战第30天】本文探讨了Python中`List.append()`方法不起作用的原因及解决方案。问题可能源于变量作用域、可变类型与不可变类型混淆、函数内的局部变量、错误的赋值操作或并发修改。解决方法包括检查变量、确保正确操作列表、使用`global`关键字、避免错误赋值和采用同步机制处理并发问题。理解这些问题对于编写健壮的Python代码至关重要。
|
5天前
|
SQL 关系型数据库 MySQL
使用Python的pymysql库连接MySQL,执行CRUD操作
使用Python的pymysql库连接MySQL,执行CRUD操作:安装pymysql,然后连接(host='localhost',user='root',password='yourpassword',database='yourdatabase'),创建游标。查询数据示例:`SELECT * FROM yourtable`;插入数据:`INSERT INTO yourtable...`;更新数据:`UPDATE yourtable SET...`;删除数据:`DELETE FROM yourtable WHERE...`。
29 0
|
5天前
|
API Python Windows
python连接chartgtp
【4月更文挑战第30天】使用Python连接ChartGPT API需安装`websocket-client`库,通过`websocket`导入并建立连接至"wss://api.chartgpt.com/v1/websocket"。订阅API如"AAPL",接收并打印响应,然后关闭连接。示例代码包括连接、订阅、接收和关闭步骤。
20 1
|
5天前
|
网络协议 算法 网络架构
Python网络编程之udp编程、黏包以及解决方案、tcpserver
Python网络编程之udp编程、黏包以及解决方案、tcpserver
|
5天前
|
关系型数据库 MySQL 数据库
Python从入门到精通:2.3.1数据库操作与网络编程:使用Python连接和操作数据库
Python从入门到精通:2.3.1数据库操作与网络编程:使用Python连接和操作数据库
|
5天前
|
JavaScript 前端开发 关系型数据库
金融技术解决方案:用Python和Vue开发加密货币交易平台
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建加密货币交易平台。首先确保安装了Python、Node.js、数据库系统和Git。后端可选择Flask或Django框架,通过RESTful API处理交易。前端利用Vue.js、Vuex和Vue Router创建用户友好的界面,并用Axios与后端通信。这种架构促进团队协作,提升代码质量和平台功能。
|
5天前
|
网络协议 安全 Java
python中socket关闭连接和释放资源
【4月更文挑战第6天】本教程讲解了网络通信后如何正确关闭连接和释放资源,以保证程序稳定性、性能及避免资源泄露和安全问题。内容涵盖TCP、HTTP连接关闭,数据库连接释放,以及内存、文件句柄、线程等资源管理。建议使用异常处理、遵循编程语言最佳实践,并定期审查代码以优化资源管理。