实例分析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中replace方法实例分析
Aug 20 Python
零基础写python爬虫之抓取糗事百科代码分享
Nov 06 Python
python在windows命令行下输出彩色文字的方法
Mar 19 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
Tesserocr库的正确安装方式
Oct 19 Python
简单了解python的break、continue、pass
Jul 08 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
Python检测端口IP字符串是否合法
Jun 05 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
使用store来优化React组件的方法
2017/10/23 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
js编写简易的计算器
2020/07/29 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python网络编程之数据传输UDP实例分析
2015/05/20 Python
python实现实时监控文件的方法
2016/08/26 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
python实现趣味图片字符化
2019/04/30 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
2020/11/18 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
酒店仓管员岗位职责
2014/04/28 职场文书
2014年小学美术工作总结
2014/12/20 职场文书
走进毛泽东观后感
2015/06/04 职场文书
初二数学教学反思
2016/02/17 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python