实例分析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函数学习笔记
Oct 07 Python
理解python多线程(python多线程简明教程)
Jun 09 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
Python实现的简单计算器功能详解
Aug 25 Python
对python调用RPC接口的实例详解
Jan 03 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
Python 实现try重新执行
Dec 21 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
使用python爬取抖音app视频的实例代码
Dec 01 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 xml文件操作代码(一)
2009/03/20 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
django 模型中的计算字段实例
2020/05/19 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
阿波罗盒子:Apollo Box
2017/08/14 全球购物
丑小鸭教学反思
2014/02/03 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
英文演讲稿
2014/05/15 职场文书
硕士生找工作求职信
2014/07/05 职场文书
运动会演讲稿300字
2014/08/25 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
2015年民主生活会发言材料
2014/12/15 职场文书
公司周年庆典致辞
2015/07/30 职场文书