>>>>场景:多线程多表入库优化--每个线程对应一张表
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author  : jia666
# Time    : 2021/3/31 17:58import time
import queue
import random
from threading import Thread
'''任务场景
多线程多表入库:
原来的入库队列只有一个主队列,队列里的数据,多为连续同属于属于一个表的数据,
在执行多线程时,由于多个线程都执行同属于一个表的数据,且第一个获取改表的线程会进行锁表,其他线程只能等待
实际效果与单线程相比,效果提升并不明显
举个有味道的例子,你就懂了
---------------------------------------*------------------
厕所有4个坑位,每个坑位只允许一个部门的人上厕所,有一群人排队上厕所,他们都是一个部门的,因为喜欢结伴一起去,
厕所每次进四个人,然而,四个人都是同一个部门的,按规定,只能使用指定的一个坑位,结果就是四个人用一个坑位,等待前一个人用完才能用
效率低下,其他三个坑位没有用,浪费资源
----------------------------------------------------------
优化:
将一个主队列分为多个线程子队列
每个线程子队列处理特定的一个表,这样避免上面出现的锁表等待问题
当线程子队列完成其任务,再次从主队列获取一个表的子队列进行入库举个有味道的例子,你就懂了
---------------------------------------*------------------
厕所有4个坑位,每个坑位只允许一个部门的人上厕所,有一群人排队上厕所,他们都是一个部门的,因为喜欢结伴一起去,
按部门分为四个队伍,每次厕所进4个人,每个队伍出来一个人,这样就效率提高了,没有浪费坑位
----------------------------------------------------------
'''class Mysql(Thread):'模拟数据入库'def __init__(self,task_queue):super().__init__()self.task_queue=task_queue #任务队列def run(self):while not self.task_queue.empty():self.task_queue.get() #获取一个数据a = random.randint(1, 3)  # 随机时间time.sleep(a) #模拟入库需要的时间print('----已处理一个数据------')class auxiliary_function(object):'辅助对象'def __init__(self):passdef create_queue(self):'模拟主队列数据'#global main_quefor i in range(7):for j in range(5):main_que.put(('table'+str(i),j)) #模拟主队列生成数据,(表名,数据)def names_var(self):'生成动态变量'for i in range(Mysql_thd): #生成动态变量队列names['queue_' + str(i)] = queue.Queue()register_dict.update({'queue_' + str(i):-1})def main_split_queue(self):'主队列数据分配到子队列'while not main_que.empty():table,df=main_que.get()tmp_queue=Falsefor key,value in register_dict.items():if value==-1: #说明此为空队列tmp_queue=names.get(key)# 临时队列指针-指向动态新增变量队列register_dict.update({key:table}) #更新变量队列专属对应的表名tmp_queue.put((table,df))breakelif value==table: #改表名称已有专属对应队列tmp_queue=names.get(key)# 临时队列指针-指向动态新增变量队列tmp_queue.put((table, df))breakelse: #其他不处理passif not tmp_queue: #已经没有专属队列可以分配,退出循环main_que.put((table,df))breakdef count_size(self):'统计每个子队列的含有的数据量'for key,value in register_dict.items():tmp_queue=names.get(key)# 临时队列指针-指向动态新增变量队列print(key,tmp_queue.qsize())def thd_to_mysql(self):'初始化多线程入库'for que_id,table_name in register_dict.items():tmp_queue = names.get(que_id)  # 临时队列指针-指向动态新增变量队列sa=Mysql(task_queue=tmp_queue)sa.start()thd_dict.update({que_id:sa})def check_thd_alive(self):'检测线程是否存活-触发二次分配'spilt_sign=False    #触发子队列分配标识符for que_id,thd_id in thd_dict.items():if not thd_id.is_alive():#如果入库线程不存活-register_dict.update({que_id:-1})spilt_sign=Trueif spilt_sign:self.main_split_queue() #触发下一次的子队列分配def data_to_sql(self):'持续多线程入库'for que_id,table_name in register_dict.items():tmp_queue = names.get(que_id)  # 临时队列指针-指向动态新增变量队列thd_id=thd_dict.get(que_id)if not thd_id.is_alive():  # 如果入库线程不存活-sa=Mysql(task_queue=tmp_queue)sa.start()thd_dict.update({que_id:sa})def while_mysql(self):'循环入库-直至入库完成'self.thd_to_mysql() #初始第一次启动while not main_que.empty():self.check_thd_alive()self.data_to_sql()def run(self):'运行主函数'self.names_var()  # 创建子队列变量self.create_queue()  # 创建主队列数据self.main_split_queue()  # 主队分割多个队列self.while_mysql() # 循环入库,直至完成
if __name__ == '__main__':main_que=queue.Queue()  #模拟主任务队列names = locals() # 局部变量register_dict = {}  # 登记字典Mysql_thd=5 # 入库线程数thd_dict={} # 多线程字典example=auxiliary_function() # 实例化对象example.run()   # 主函数

Python3 多线程多表入库优化相关推荐

  1. python3 多表入库再优化

    >>>>场景1:多线程多表入库优化--每个线程对应一张表 https://jia666666.blog.csdn.net/article/details/115373369 & ...

  2. 19_clickhouse,数据查询与写入优化,分布式子查询优化,外部聚合/排序优化,基于JOIN引擎的优化,SQL优化案例,物化视图提速,查询优化常用经验法则,选择和主键不一样的排序键,数据入库优化

    25.数据查询与写入优化 25.1.分布式子查询优化 25.1.1.分布式表的IN查询示例1(普通IN子查询.IN子查询为本地表) 25.1.2.分布式表的IN查询示例2(普通IN子查询.IN子查询为 ...

  3. mysql每10万条数据分区_WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案...

    1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实需求是将地方坐标系坐标反转成WGS84坐标,如果现在需要将其转换成百度坐标系数据.常规方案是先建立好整个该市的本地坐标和百度坐标 ...

  4. 数据库建表原则,SQL数据库建表前期优化,SQL数据库操作优化,数据库命名规范...

    2019独角兽企业重金招聘Python工程师标准>>> 关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关 ...

  5. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理...

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  6. Day814.电商系统表设计优化案例分析 -Java 性能调优实战

    电商系统表设计优化案例分析 Hi,我是阿昌,今天学习记录的是关于电商系统表设计优化案例分析. 如果在业务架构设计初期,表结构没有设计好,那么后期随着业务以及数据量的增多,系统就很容易出现瓶颈. 如果表 ...

  7. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...

  8. python3 多线程_python3多线程知识点总结

    多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条 ...

  9. python多线程爬虫实例-Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

最新文章

  1. 一次线上 JVM 调优实践,FullGC 40 次/天到 10 天一次的优化过程
  2. python写入中文、用utf-16编码得出二进制字节串_在python中将unicode UTF16数据写入文件时出现问题...
  3. java-基础-java/c++
  4. 如何使用Topshelf管理Windows服务
  5. mysql 唯一索引 二叉法_mysql 唯一索引
  6. css before after用法_CSS 伪元素基础知识:content 与counter 实用技巧(二)
  7. 走访近20家代工厂后:近千块的大牌T恤,成本只要几十块
  8. C++ 11 深度学习(十)原始字面量
  9. 前端学习(2788):完成图片商品数据页面渲染
  10. JSON解析工具比较,主要GSON和FastJSON
  11. 入侵sql serve 后拿服务器_quot;条条大路quot;拿webshell
  12. springcloud工作笔记091---tk.mybatis.mapper.MapperException: 当前实体类不包含名为XXXXX的属性!
  13. exit函数_Linux进程间通信详解(三) 消息队列及函数
  14. 2016年最好的15个Web设计和开发工具
  15. 图像处理之基础---大话小波和卷积
  16. Java 视频生成缩略图教程
  17. windows实用工具集
  18. wine装通达信_通过wine使用通达信、钱龙、同花顺、大智慧软件 | 学步园
  19. 做word计算机海报图片,怎么用word制作海报 海报制作方法
  20. 莱布尼兹其实离开我们并不遥远

热门文章

  1. 反病毒工具-火绒剑 博客
  2. [Python从零到壹] 五十六.图像增强及运算篇之图像平滑(中值滤波、双边滤波)
  3. 如何给文件夹加密【转】
  4. 计算机cdef盘无法显示,科技常识:如何解决电脑CDEF盘都打不开出现ldq
  5. unity Quad剔除背面并剔除透明部分的shader
  6. python 开发培训视频教程
  7. 接触角测量方法的发展
  8. SaaS服务:虽霸主未成,但不乏强者
  9. (三)软件测试理论(了解软件的缺陷知识)
  10. ES集群规划、集群搭建、集群管理