实例分析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去除所有html标签的方法
May 05 Python
python运行时间的几种方法
Jun 17 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
Python使用functools实现注解同步方法
Feb 06 Python
Python程序运行原理图文解析
Feb 10 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
python文件处理fileinput使用方法详解
Jan 02 Python
python实现人机五子棋
Mar 25 Python
基于Python实现粒子滤波效果
Dec 01 Python
python常量折叠基础知识点讲解
Feb 28 Python
python使用BeautifulSoup 解析HTML
Apr 24 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
codeigniter框架批量插入数据
2014/01/09 PHP
PHP答题类应用接口实例
2015/02/09 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
javascript在IE下trim函数无法使用的解决方法
2014/09/12 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
vue项目接口域名动态获取操作
2020/08/13 Javascript
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
荟萃全球保健品:维他购
2018/05/09 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
电子信息科学专业自荐信
2014/01/30 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
责任担保书范文
2014/05/21 职场文书
中秋节随笔
2015/08/15 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python