实例分析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的循环体中使用else语句的方法
Mar 30 Python
Python正则表达式知识汇总
Sep 22 Python
pandas中Timestamp类用法详解
Dec 11 Python
Python使用flask框架操作sqlite3的两种方式
Jan 31 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
python使用matplotlib绘制雷达图
Oct 18 Python
Python3 A*寻路算法实现方式
Dec 24 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
使用Python将语音转换为文本的方法
Aug 10 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 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版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
javascript 一些用法小结
2009/09/11 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
js 图片转base64的方式(两种)
2018/04/24 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
python列表与元组详解实例
2013/11/01 Python
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
python计算书页码的统计数字问题实例
2014/09/26 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Django密码系统实现过程详解
2019/07/19 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
园林设计师自荐信
2013/11/18 职场文书
竞赛口号大全
2014/06/16 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
区域销售大会开幕词
2016/03/04 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python