实例分析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获取目录下所有文件的方法
Jun 01 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
关于python写入文件自动换行的问题
Jun 23 Python
Python基于SMTP协议实现发送邮件功能详解
Aug 14 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
python抓取搜狗微信公众号文章
Apr 01 Python
python儿童学游戏编程知识点总结
Jun 03 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
python实现apahce网站日志分析示例
2014/04/02 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python使用gRPC传输协议教程
2018/10/16 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
征婚广告词
2014/03/17 职场文书
报关报检委托书
2014/04/08 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
中秋节活动总结
2014/08/29 职场文书
学前教育专业求职信
2014/09/02 职场文书
健康状况证明模板
2014/10/23 职场文书