mysqlclient和pymysql如何选择?_gevent_waiter的使用

    使用python连接mysql,是需要三方包的,目前主流的方式就是pymysql 和 mysqlclient(也就是Python3版本的MySQLdb)。还有一个cymysql(fork of pymysql with optional C speedups)

 

1. 两个库的作者是同一个人INADA Naoki, pip库邮箱都指向mailto:[email protected]

2. PyMySQL的代码人员methane说mysqlclient速度更快及PyMySQL的应用场景

 

    那么,我们应该如何选择呢?首先,需要了解下这两个包的大概。

    一、pymysql

      1)纯Python实现的,安装简单(直接pip安装)

      2)  由于纯Python实现的,可以很好的跟gevent框架结合

 

二、mysqlclient

    1)是一个C扩展模块,编译安装可能会导致报各种错误,明显没有pymysql方便

    2)速度快;

 

对比上面,你就应该会清楚,pymysql的性能是比mysqlclient较差的,但是pymysql简单易使用。一般你都要选择mysqlclient除非以下三种情况:

1)你不能用libmysqlclient出于某种原因

2)你想使用gevent or eventlet 配合

3)  考虑mysql协议兼容性

原文是这样的:

mysqlclient-python is much faster than PyMySQL.
When to use PyMySQL is:

You can't use libmysqlclient for some reason
You want to use monkeypatched socket of gevent or eventlet
You wan't to hack mysql protocol

上面的原因,导致目前使用pymysql的程序员远超过mysqlclient,特别是第二条,现在的python站点,基本都要用gevent或者eventlet吧。

强大的mysqlclient已经解决了,mysqlclient目前也是可以使用gevent了。直接上代码:

import MySQLdb
import gevent.hub

def _gevent_waiter(fd, hub=gevent.hub.get_hub()):
    hub.wait(hub.loop.io(fd, 1))




conn = MySQLdb.connect(
                db=self.db,
                host=self.host if not self.ssh else LOOPBACK_ADDRESS,
                port=self.port if not self.ssh else int(self.ssh.local_bind_port),
                user=self.user,
                password=self.passwd,
                charset=self.charset,
                connect_timeout=self.connect_timeout,
                cursorclass=DictCursor,
                use_unicode=True,
                waiter=_gevent_waiter,
            )


上面的连接方式,其他参数不多解释了,就说waiter吧,有了这个相当于mysqlclinet可以完美配合gevent了。

不了解那个_gevent_waiter,可以看看这篇文章  gevent hub 。

那么,我们怎么测试呢?测试过程比较简单,起一个单进程的 web服务,连接数据库的时候查询的时候,在数据库执行time.sleep 20秒,这个时候看其他请求这个 web服务还能处理请求不,用了waiter=_gevent_waiter完美啊。。。

有了这个,一个拥有大量数据库查询服务的系统,我可能再也不会用tornado了。。

 

github地址:

https://github.com/PyMySQL/mysqlclient-python

https://github.com/PyMySQL/PyMySQL/

 

目前pymysql和mysqlclient的各项指标对比:

https://python.libhunt.com/compare-mysqlclient-python-vs-pymysql

很寒心啊,,,大多程序猿还是比较怕麻烦,选择了简单易用但是性能较差的pymysql......pymysql比MySQLdb慢太多了,所以大项目感觉pymysql还是有点鸡肋啊,在此建议,使用MySQLdb。

 

 

你可能感兴趣的:(python,django,mysql)