http://rfyiamcool.blog.51cto.com/1030776/1338174/
PySQL针对mysql操作demo还算简单的~
import pymysql
db = pymysql.connect(host = 'localhost', passwd = '123123', user = 'root', db = 'rui')
cursor = db.cursor()
sql='select count(*) from kkk'
data = cursor.execute(sql)
print cursor
cursor.close()
db.close()
#!/usr/bin/python
# -*- coding: utf-8 -*-
#xiaorui.cc
import MySQLdb, pymysql
import signal, os, sys
workers = {}
def run():
con = MySQLdb.connect(host='localhost', db='rui', user='root', passwd='123123')
signal.signal(signal.SIGTERM, lambda sig, status: sys.exit(0))
cur = con.cursor()
cur.execute("SELECT SLEEP(30)")
def killall(sig, status):
for pid in workers.keys():
os.kill(pid, signal.SIGTERM)
def waitall():
for pid in workers.keys():
try:
os.waitpid(pid, 0)
except:
print "waitpid: interrupted exception"
def main():
print os.getpid()
signal.signal(signal.SIGTERM, killall)
for i in range(3):
pid = os.fork()
if pid == 0:
try:
run()
except:
print "run: interrupted exception"
sys.exit(0)
else:
workers[pid] = 1
waitall()
if __name__ == '__main__':
main()
好了说正题,今天怎么主要说的就是gevent和python下的mysql驱动测试,分享个gevent和pymysql的在一起使用的实例demo ~
def goodquery(sql):
db = pymysql.connect(host = 'localhost', passwd = '123123', user = 'root', db= 'rui')
cursor = db.cursor()
data = cursor.execute(sql)
cursor.close()
db.close()
return cursor
sqla='select count(*) from kkk'
sqlb="select * from kkk where name like '%888888%'"
jobs = [gevent.spawn(goodquery, (sqla)),gevent.spawn(goodquery, (sqlb))]
#jobs = [gevent.spawn(goodquery, (sqla)),gevent.spawn(goodquery,(sqlb)),gevent.spawn(goodquery,(sqlb))]
gevent.joinall(jobs, timeout=2)
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
哎,还是有点堵塞。。。 跑了6个耗时3s的sql,共用了18秒的时间。。。。
经过一上午的折腾,得知gevent的版本没有用对,只有gevent 1.0 才完美支持socket,然后需要在引入模块的后面,打上别的补丁!
gevent.monkey.patch_socket()
real 0m8.993s
user 0m0.071s
sys 0m0.016s
import pymysql
import threading
def goodquery(sql):
db = pymysql.connect(host = 'localhost', passwd = '123123', user = 'root', db= 'rui')
cursor = db.cursor()
data = cursor.execute(sql)
cursor.close()
db.close()
print cursor
return cursor
sqla='select count(*) from kkk'
sqlb="select * from kkk where name like '%888888%'"
#jobs = [gevent.spawn(goodquery,(sqla)),gevent.spawn(goodquery,(sqlb)),gevent.spawn(goodquery,(sqlb)),gevent.spawn(goodquery,(sqlb)),gevent.spawn(goodquery,(sqlb))]
#jobs = [gevent.spawn(goodquery, (sqla)),gevent.spawn(goodquery,(sqlb)),gevent.spawn(goodquery,(sqlb))]
#gevent.joinall(jobs, timeout=30)
#what_you_want = [job.value for job in jobs]
threads=[]
for i in range(5):
threads.append( threading.Thread( target=goodquery,args=(sqlb,) ) )
for t in threads:
t.start()
for t in threads:
t.join()
他的测试结果要比gevent慢点 ~但也是并发的执行,可以在mysql进程里面看到执行的记录 ~
[root@101 ~]# time python t.py
real 0m11.122s
user 0m0.095s
sys 0m0.026s