实例分析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 set集合类型操作总结
Nov 07 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
利用Python实现网络测试的脚本分享
May 26 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python递归函数实例讲解
Feb 27 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
Python3 JSON编码解码方法详解
Sep 06 Python
简单了解Django项目应用创建过程
Jul 06 Python
python绘制趋势图的示例
Sep 17 Python
python基于openpyxl生成excel文件
Dec 23 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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
destoon安全设置中需要设置可写权限的目录及文件
2014/06/21 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
thinkPHP实现签到功能的方法
2017/03/15 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python程序控制NAO机器人行走
2019/04/29 Python
Python实现12306火车票抢票系统
2019/07/04 Python
Django缓存系统实现过程解析
2019/08/02 Python
python动态文本进度条的实例代码
2020/01/22 Python
python RSA加密的示例
2020/12/09 Python
SOKOLOV官网:俄罗斯珠宝首饰品牌
2021/01/02 全球购物
社会保险接收函
2014/01/12 职场文书
家具促销活动方案
2014/02/16 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
国际会计专业求职信
2014/08/04 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
vue使用watch监听属性变化
2022/04/30 Vue.js