实例分析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实现获取某天是某个月中的第几周
Feb 11 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
python操作mysql数据库
Mar 05 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
Pytorch转tflite方式
May 25 Python
如何理解python面向对象编程
Jun 01 Python
通过实例解析Python RPC实现原理及方法
Jul 07 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
python和opencv构建运动检测器的实现
Mar 03 Python
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 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采集时被封ip的解决方法
2010/08/29 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
PHP强制转化的形式整理
2020/05/22 PHP
JavaScript表单常用验证集合
2008/01/16 Javascript
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
web 页面分页打印的实现
2009/06/22 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
vuex的简单使用教程
2018/02/02 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
react实现同页面三级跳转路由布局
2019/09/26 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python实现数独算法实例
2015/06/09 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
PyQt5实现登录页面
2020/05/30 Python
如何在python中实现线性回归
2020/08/10 Python
基于python实现复制文件并重命名
2020/09/16 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
佳能法国商店:Canon法国
2019/02/14 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
如何写毕业求职自荐信
2013/11/06 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
实习证明格式范文
2014/10/14 职场文书
2016年社区中秋节活动总结
2016/04/05 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python