实例分析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实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
python的Tqdm模块的使用
Jan 10 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
Django url,从一个页面调到另个页面的方法
Aug 21 Python
python文件读写代码实例
Oct 21 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
记一次django内存异常排查及解决方法
Aug 07 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 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使用ODBC连接数据库的方法
2015/07/18 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
javascript刷新父页面方法汇总详解
2019/10/10 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
jQuery中event.target和this的区别详解
2020/08/13 jQuery
python实现文本文件合并
2015/12/29 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python异常处理操作实例详解
2018/08/28 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
解决方案设计综合面试题
2015/08/31 面试题
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
介绍下java.util.Arrays类
2012/10/16 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
督导岗位职责范本
2015/04/10 职场文书
2015党建工作简报
2015/07/21 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python