实例分析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双向链表实现实例代码
Nov 21 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
Python简单实现自动删除目录下空文件夹的方法
Aug 29 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
将python文件打包成EXE应用程序的方法
May 22 Python
numpy中的ndarray方法和属性详解
May 27 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
Python 中的单分派泛函数你真的了解吗
Jun 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
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
优化javascript的执行速度
2010/01/23 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Django实现文件上传下载
2019/10/06 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Python实现自动访问网页的例子
2020/02/21 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
学生自我鉴定
2013/12/18 职场文书
新春联欢会主持词
2014/03/24 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python