实例分析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内置函数bin() oct()等实现进制转换
Dec 30 Python
初步剖析C语言编程中的结构体
Jan 16 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python DataFrame 修改列的顺序实例
Apr 10 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
python儿童学游戏编程知识点总结
Jun 03 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
解决django FileFIELD的编码问题
Mar 30 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
浅谈python出错时traceback的解读
Jul 15 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
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
空气环保标语
2014/06/12 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
公积金具结保证书
2015/05/11 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL