实例分析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中expandtabs()方法的使用
May 18 Python
python Django批量导入不重复数据
Mar 25 Python
用Python解决计数原理问题的方法
Aug 04 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
Python模块 _winreg操作注册表
Feb 05 Python
python模拟哔哩哔哩滑块登入验证的实现
Apr 24 Python
浅析Python __name__ 是什么
Jul 07 Python
Django如何实现防止XSS攻击
Oct 13 Python
Python 实现一个简单的web服务器
Jan 03 Python
解决numpy和torch数据类型转化的问题
May 23 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无限极分类实现的两种解决方法
2013/04/28 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
Python中使用SAX解析xml实例
2014/11/21 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
致标枪运动员加油稿
2014/02/15 职场文书
车队司机自我鉴定
2014/03/02 职场文书
小学教师党员承诺书
2015/04/27 职场文书
网吧员工管理制度
2015/08/05 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
python turtle绘图命令及案例
2021/11/23 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android