使用python中协程中的gevent模块实现并发查询数据库。
考虑过用多线程,但线程之间共享全局变量,可能会出现数据错乱问题,故使用多协程。
import time
import gevent
from py2neo import Node
from RDPlatform.common.sqlSentence import exe_sql_all
from RDPlatform.settings import graph
# 开始时间
start_time = time.time()
list1 = []
sql1 = "select id ,username from rdsystem_user"
row1 = exe_sql_all(sql1)
n=len(row1)
# print(n)
m = n // 4
r1 = []
r2 = []
r3 = []
r4 = []
for j in row1:
i = row1.index(j) + 1
if i <= m:
r1.append(j)
if i > m and i <= m * 2:
r2.append(j)
if i > m * 2 and i <= m * 3:
r3.append(j)
if i > m * 3 and i <= n:
r4.append(j)
# print(len(r1), len(r2), len(r3), len(r4))
# 使用协程
gevent.joinall([
gevent.spawn(createusers, r1),
gevent.spawn(createusers, r2),
gevent.spawn(createusers, r3),
gevent.spawn(createusers, r4),
])
for r in row1:
sql_id = str(r[0])
username = r[1]
list1.append({
'sql_id':sql_id,
'username':username
})
# 结束时间
stop_time = time.time()
print('run time is %s' % (stop_time - start_time))