实例分析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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
python实现windows下文件备份脚本
May 27 Python
Django objects的查询结果转化为json的三种方式的方法
Nov 07 Python
python游戏地图最短路径求解
Jan 16 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
python实现文件的分割与合并
Aug 29 Python
通过实例解析Python调用json模块
Dec 11 Python
python3.8下载及安装步骤详解
Jan 15 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
Python 在函数上添加包装器
Jul 28 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
Javascript中的数学函数
2007/04/04 Javascript
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
python中__slots__用法实例
2015/06/04 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
Python 函数基础知识汇总
2018/03/09 Python
django初始化数据库的实例
2018/05/27 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
详解python中各种文件打开模式
2020/01/19 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
高中班长自我鉴定
2013/12/20 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
企业总经理任命书
2014/06/05 职场文书
交通志愿者活动总结
2014/06/27 职场文书
政风行风评议整改方案
2014/09/15 职场文书
入党自传范文2015
2015/06/26 职场文书
董事长致辞
2015/07/29 职场文书
golang slice元素去重操作
2021/04/30 Golang
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis