实例分析python3实现并发访问水平切分表


Posted in Python onSeptember 29, 2018

场景说明

假设有一个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 相关文章推荐
Python实现二分查找算法实例
May 26 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
使用python实现接口的方法
Jul 07 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
python 多线程重启方法
Feb 18 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 Python
3个用于数据科学的顶级Python库
Sep 29 #Python
使用Python机器学习降低静态日志噪声
Sep 29 #Python
python实现字符串和字典的转换
Sep 29 #Python
python实现字符串中字符分类及个数统计
Sep 28 #Python
python中使用zip函数出现错误的原因
Sep 28 #Python
python中的for循环
Sep 28 #Python
Django migrations 默认目录修改的方法教程
Sep 28 #Python
You might like
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
短信提示使用 特效
2007/01/19 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
jquery实现兼容IE8的异步上传文件
2015/06/15 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
Django框架表单操作实例分析
2019/11/04 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
高中毕业自我鉴定
2013/12/16 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
初中优秀学生评语
2014/12/29 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
毕业设计致谢词
2015/05/14 职场文书
公司仓库管理制度
2015/08/04 职场文书
导游词之太原天龙山
2020/01/02 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers