实例分析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实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
利用python实现微信头像加红色数字功能
Mar 26 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
python3的输入方式及多组输入方法
Oct 17 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python基础教程之异常详解
Jan 10 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
python 如何停止一个死循环的线程
Nov 24 Python
Python 可视化神器Plotly详解
Dec 26 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
swfupload 多文件上传实现代码
2008/08/27 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
python实现的各种排序算法代码
2013/03/04 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
社区道德讲堂实施方案
2014/03/21 职场文书
2014年化验员工作总结
2014/11/18 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
OpenCV-Python实现油画效果的实例
2021/06/08 Python