本篇文章给大家带来的内容是关于如何实现python3实现并发访问水平切分表,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

场景说明

假设有一个mysql表被水平切分,分散到多个host中,每个host拥有n个切分表。

如果需要并发去访问这些表,快速得到查询结果, 应该怎么做呢?

这里提供一种方案,利用python3的asyncio异步io库及aiomysql异步库去实现这个需求。

代码演示

import logging

import random

import asynciofrom aiomysql

import create_pool

# 假设mysql表分散在8个host, 每个host有16张子表

TBLES = { "192.168.1.01": "table_000-015",

# 000-015表示该ip下的表明从table_000一直连续到table_015

"192.168.1.02": "table_016-031",

"192.168.1.03": "table_032-047",

"192.168.1.04": "table_048-063",

"192.168.1.05": "table_064-079",

"192.168.1.06": "table_080-095",

"192.168.1.07": "table_096-0111",

"192.168.1.08": "table_112-0127",

}

USER = "xxx"PASSWD = "xxxx"# wrapper函数,用于捕捉异常def query_wrapper(func):

async def wrapper(*args, **kwargs):

try:

await func(*args, **kwargs) except Exception as e:

print(e) return wrapper

# 实际的sql访问处理函数,通过aiomysql实现异步非阻塞请求@

query_wrapperasync def query_do_something(ip, db, table):

async with create_pool(host=ip, db=db, user=USER, password=PASSWD) as pool:

async with pool.get() as conn:

async with conn.cursor() as cur:

sql = ("select xxx from {} where xxxx")

await cur.execute(sql.format(table))

res = await cur.fetchall()

# then do something...# 生成sql访问队列, 队列的每个元素包含要对某个表进行访问的函数及参数def gen_tasks():

tasks = [] for ip, tbls in TBLES.items():

cols = re.split('_|-', tbls)

tblpre = "_".join(cols[:-2])

min_num = int(cols[-2])

max_num = int(cols[-1])

for num in range(min_num, max_num+1):

tasks.append(

(query_do_something, ip, 'your_dbname', '{}_{}'.format(tblpre, num))

)

random.shuffle(tasks)

return tasks# 按批量运行sql访问请求队列def run_tasks(tasks, batch_len):

try:

for idx in range(0, len(tasks), batch_len):

batch_tasks = tasks[idx:idx+batch_len]

logging.info("current batch, start_idx:%s len:%s" % (idx, len(batch_tasks)))

for i in range(0, len(batch_tasks)):

l = batch_tasks[i]

batch_tasks[i] = asyncio.ensure_future(

l[0](*l[1:])

)

loop.run_until_complete(asyncio.gather(*batch_tasks))

except Exception as e:

logging.warn(e)# main方法, 通过asyncio实现函数异步调用def main():

loop = asyncio.get_event_loop()

tasks = gen_tasks()

batch_len = len(TBLES.keys()) * 5 # all up to you

run_tasks(tasks, batch_len)

loop.close()

python 并发访问数据库_【数据库】如何实现python3实现并发访问水平切分表相关推荐

  1. 数据库_数据库篇-第一章:数据库基本概念

    基础知识学习,面试必备,关注吧 骚年 01 第一,什么是数据库? 维基百科上是这样定义的: 所谓"数据库"是以一定方式储存在一起.能予多个用户共享.具有尽可能小的冗余度.与应用程序 ...

  2. webapp支持什么数据库_数据库和Webapp安全

    webapp支持什么数据库 威胁模型 这是根据我网站上的快速参考页松散地讨论数据库和webapp安全的问题. 该页面变得笨拙,并且使读者无法轻松地与我或其他人进行交互. 威胁模型 所有安全分析必须从检 ...

  3. 1MySQL是面向对象型数据库_数据库及MySQL基础(1)

    一.数据库概述 关系型数据库:面对关系,Java面向对象.html ·常见数据库mysql Oracle(神喻):甲骨文 DB2:IBM SQL Server:微软 Sybase:赛尔斯 MySQL: ...

  4. mysql语句数据库_数据库的Mysql语句

    数据库的mysql语句: 1.连接数据库 mysql -u root -p 2.显示数据库 show databases(db); 3.选择数据库 use 数据库名; 4.显示数据库中的表 show ...

  5. python非法变量名_数据库错误:ORA-01036:非法变量名/numb

    我认为您误解了绑定变量如何与Oracle和cx_Oracle一起工作. Oracle将SQL查询中的:myvar等表达式识别为绑定变量占位符.当遇到这种情况时,它会注意到在运行查询之前它需要这个变量的 ...

  6. python飞机票预定系统_数据库课程设计 - 机票预订系统

    一.机票预定系统 1.1 题目要求 要求具备如下基本功能 班机基本信息的管理: 航班信息的管理: 旅客预定机票.取消预约.付款取票.退票的管理: 查询航班信息.航班预定情况.旅客信息,计算航班满座率. ...

  7. python 乱码转码_数据库乱码问题 Python 编码问题(Unicode 的 encode、decode 相互转换 )...

    前言: 今天有个项目需要合并(A合并到B),我所做的就是数据库的合并操作,其中出现的主要问题就是乱码的问题.乱码这个问题是很常见的问题,今天整理了下自己所理解的一点见解. 案例: NAME COMPA ...

  8. java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

    回复 2楼 林月儿 我按着你的方法试了下,可还是这个判断不能执行                    if(password.equals(drmm.getText())){ view.setTex ...

  9. java 数据结构 数据库_数据库索引背后的数据结构

    在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法.这种数据结构,就是索引. B-Tree B-Tree是一种 ...

最新文章

  1. 对抗软件系统复杂性①:如无必要,勿增实体
  2. 你还在认为 count(1) 比 count(*) 效率高?
  3. 8 - 9 template两大功能 : simple_tag、模板继承
  4. Foundation框架介绍
  5. python怎么读excel文件-python如何读写excel文件
  6. pytorch 笔记 :实现Dropout
  7. 卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
  8. 特征计算 - 遍历求值提速 6 万倍 lambda...if...else(if...else...) +map() 对比 iterrows() - Python代码
  9. 讲故事形式解释什么是股票_讲故事的人可以教公开领导者什么
  10. 还在直接操作Redis?赶快来试试它....
  11. matlab打开矩阵表,如何将Excel数据导入MATLAB中?:EXCLE中通过矩阵表输出选项
  12. linux版本信息i686,Linux下如何查看版本信息
  13. gitee markdown 笔记_Gitee+PicGo+Pandoc+Typora组建markdown编辑器
  14. 带背景音乐的表白html,感人的表白背景音乐,适合浪漫表白的纯音乐
  15. Oracle掌管权限和角色
  16. 小程序微信JSAPI支付进行退款操作
  17. 计算机桌面文件能单独设密码吗,告诉你怎么给文件夹设置密码
  18. 方正飞鸿ES2007SOA工作流开发平台视频演示材料目录
  19. BIOS设置中功能的翻译及介绍
  20. php源码后台密码被改了,帝国cms后台密码重置插件后台密码恢复找回密码工具

热门文章

  1. Mysql的存储过程修改表的数据:项目上一个小练习
  2. Basic各编码每个字符占用字节个数
  3. c语言的查询功能,求C语言实现查询功能(如果选择3,如何实现查询)
  4. bootstrap table排序php,bootstraptable排序可以么
  5. java面试宝典有用么_常见的Java面试题汇总
  6. 删除ubuntu linux系统,从Windows双启动中卸载Ubuntu Linux
  7. python函数图像平移_[Python图像处理]六.图像缩放,图像旋转,图像翻转与图像平移...
  8. yum 错误:Invalid configuration value: failovermethod=priority
  9. 【Mybatis】 mapper XML 文件中使用 association 实现一对一关联
  10. 查看oracle连接数的消耗情况