Python中多线程备份数据库的操作是怎样,好在哪
Admin 2022-07-23 群英技术资讯 969 次浏览
今天这篇给大家分享的知识是“Python中多线程备份数据库的操作是怎样,好在哪”,小编觉得挺不错的,对大家学习或是工作可能会有所帮助,对此分享发大家做个参考,希望这篇“Python中多线程备份数据库的操作是怎样,好在哪”文章能帮助大家解决问题。1.多线程比单线程运行要快很多,比如在我工作中,每台服务器至少8个库以上,用单线程备份太慢了。
2.不是越多线程就会越好,而是根据服务器的资源来合理定义worker线程,否则会造成服务器严重负载,影响到线上业务。
3.备份数据库都是消耗IO操作,用多线程比多进程稍微会更有优势。
从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进程池)两个类。
相比 threading 等模块,该模块通过 submit 返回的是一个 future 对象,它是一个未来可期的对象,通过它可以获悉线程的状态主线程(或进程)中可以获取某一个线程(进程)执行的状态或者某一个任务执行的状态及返回值:
主线程可以获取某一个线程(或者任务的)的状态,以及返回值。
当一个线程完成的时候,主线程能够立即知道。
让多线程和多进程的编码接口一致。
from concurrent.futures import ThreadPoolExecutor
import time
def test_thread(sec):
time.sleep(sec)
print(f"sleep {sec} done")
return sec
with ThreadPoolExecutor(max_workers=4) as t: # 创建一个最大容纳数量为4的线程池
task1 = t.submit(test_thread, 1)
task2 = t.submit(test_thread, 2) # 通过submit提交执行的函数到线程池中
task3 = t.submit(test_thread, 3)
print(f"task1: {task1.done()}") # 通过done来判断线程是否完成
print(f"task2: {task2.done()}")
print(f"task3: {task3.done()}")
time.sleep(2.5)
print(f"task1: {task1.done()}")
print(f"task2: {task2.done()}")
print(f"task3: {task3.done()}")
print(task1.result()) # 通过result来获取返回值
结果输出:
task1: False task2: False task3: False sleep 1 done sleep 2 done task1: True task2: True task3: False 1 sleep 3 done
使用 with 语句 ,通过 ThreadPoolExecutor 构造实例,同时传入 max_workers 参数来设置线程池中最多能同时运行的线程数目。
使用 submit 函数来提交线程需要执行的任务到线程池中,并返回该任务的句柄(类似于文件、画图),注意 submit() 不是阻塞的,而是立即返回。
通过使用 done() 方法判断该任务是否结束。上面的例子可以看出,提交任务后立即判断任务状态,显示3个任务都未完成。在延时2.5后,task1 和 task2 执行完毕,task3 仍在执行中。
import time
from concurrent.futures import ThreadPoolExecutor
def spider(page):
time.sleep(page)
return page
start = time.time()
executor = ThreadPoolExecutor(max_workers=4)
i = 1
for result in executor.map(spider, [2, 3, 1, 4]):
print("task{}:{}".format(i, result))
i += 1
结果输出:
task1:2 task2:3 task3:1 task4:4
from concurrent.futures import ThreadPoolExecutor有两种方式,一种是submit()函数,另一种是map()函数,两者的主要区别在于:
1.map可以保证输出的顺序, submit输出的顺序是乱的
2.如果你要提交的任务的函数是一样的,就可以简化成map。但是假如提交的任务函数是不一样的,或者执行的过程之可能出现异常(使用map执行过程中发现问题会直接抛出错误)就要用到submit()
3.submit和map的参数是不同的,submit每次都需要提交一个目标函数和对应的参数,map只需要提交一次目标函数,目标函数的参数放在一个迭代器(列表,字典)里就可以。
环境:centos6,数据库版本5.7,数据备份2个1.7G、一个800M、一个200M
第一种:shell脚本for的方式备份4个数据库
#!/bin/bash
backup_path="/data/backup/"
myuser="root"
mypwd="123456"
db_name="test_1000"
current_time=$(date +%Y%m%d%H%M%S)
for i in $(seq 4);do
/usr/local/mysql/bin/mysqldump -u${myuser} -p${mypwd} --single-transaction --master-data=2 --set-gtid-purged=off "${db_name}${i}" | gzip > ${backup_path}/"${db_name}${i}"_${current_t
ime}.sql.gz
done
查看执行时间
mysqldump: [Warning] Using a password on the command line interface can be insecure. mysqldump: [Warning] Using a password on the command line interface can be insecure. mysqldump: [Warning] Using a password on the command line interface can be insecure. mysqldump: [Warning] Using a password on the command line interface can be insecure. real 4m28.421s user 3m50.360s sys 0m5.962s
第二种方式:多线程备份

可以明显看到优势
在服务器上有需要备份多个数据库时,使用python多线程的方式比传统的shell脚本循环备份会更有优势,可以充分利用服务器上的资源,有效提升效率。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python 操作 Excel 之 openpyxl 模块,文章基于python的相关资料展开对 openpyxl 模块的详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
这篇文章主要为大家详细介绍了Python实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Python3内置函数--all() 函数:如果 iterable 的所有元素为真(或迭代器为空),返回 True
深入解析Python中的多进程,小编通过实际的案例向大家展示了操作过程,简单易懂,有需要的朋友可以参考了解看看,那么接下来就跟随小编的思路来往下学习吧,希望对大家学习或工作能有帮助。
要求给定指定的行、列以及对应的工作表作为参数,能够正确解析合并单元格,获取指定单元格的值。如果直接根据行列获取对应单元格的值,则合并单元格非左上角的其他单元格都会获取到None值。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008