PyMysql是pure python的mysql驱动,因此可以通过gevent实现协程化,从而实现基于协程的mysql查询.
比基于多线程的连接池效率更高.(单纯查询场景,不考虑读写混合的事务问题)
测试代码参考峰云的博客.
在win7, python2/3环境测试通过
#!/usr/bin/python
# -*- coding: utf-8 -*-
#测试gevent+PyMysql实现非阻塞查询
import gevent
#from gevent import socket #单纯这样是不行的
import pymysql
from gevent import monkey
#monkey.patch_all() #可以
monkey.patch_socket() #只patch_socket就可以
def nbquery(sql):
db = pymysql.connect(host = '192.168.5.125', passwd = '111', user = 'root', db= 'test')
cursor = db.cursor()
data = cursor.execute(sql)
cursor.close()
db.close()
return cursor
sqla='select count(*) from person'
sqlb="select * from person where name like '%abc%'"
sqlc="SELECT SLEEP(5)"
#jobs = [gevent.spawn(nbquery, (sqla)),gevent.spawn(nbquery, (sqlb))]
jobs = [gevent.spawn(nbquery, (sqlc)),gevent.spawn(nbquery,(sqlc)),gevent.spawn(nbquery,(sqlc))]
gevent.joinall(jobs, timeout=10)
what_you_want = [job.value for job in jobs]
print(what_you_want)
#for i in what_you_want:
# for a in i:
# print a
#
#D:\fk\work\python\gevent\mysql>python tgmysql.py
#[<pymysql.cursors.Cursor object at 0x0000000002D4FB38>, <pymysql.cursors.Cursor
#object at 0x0000000002D4FDD8>, <pymysql.cursors.Cursor object at 0x0000000002D4F
#EB8>]