实例分析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中使用序列的方法
Aug 03 Python
Windows下python2.7.8安装图文教程
May 26 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python处理Excel xlrd的简单使用
Sep 12 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Sanic框架安装与简单入门示例
Jul 16 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
对python pandas中 inplace 参数的理解
Jun 27 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 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
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
广告显示判断
2006/08/31 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
原生js实现随机点餐效果
2019/12/10 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
简单了解python中的与或非运算
2019/09/18 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
CSS3等相关属性制作分页导航实现代码
2012/12/24 HTML / CSS
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
拔河比赛口号
2014/06/10 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
怒海潜将观后感
2015/06/11 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书