- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python使用多线程备份数据库的步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1.多线程比单线程运行要快很多,比如在我工作中,每台服务器至少8个库以上,用单线程备份太慢了.
2.不是越多线程就会越好,而是根据服务器的资源来合理定义worker线程,否则会造成服务器严重负载,影响到线上业务.
3.备份数据库都是消耗IO操作,用多线程比多进程稍微会更有优势.
从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进程池)两个类。 相比 threading 等模块,该模块通过 submit 返回的是一个 future 对象,它是一个未来可期的对象,通过它可以获悉线程的状态主线程(或进程)中可以获取某一个线程(进程)执行的状态或者某一个任务执行的状态及返回值: 主线程可以获取某一个线程(或者任务的)的状态,以及返回值。 当一个线程完成的时候,主线程能够立即知道。 让多线程和多进程的编码接口一致。 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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来获取返回值
|
结果输出
1
2
3
4
5
6
7
8
9
10
|
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 仍在执行中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
|
结果输出
1
2
3
4
|
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个数据库 。
1
2
3
4
5
6
7
8
9
10
|
#!/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
|
查看执行时间 。
1
2
3
4
5
6
7
8
|
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脚本循环备份会更有优势,可以充分利用服务器上的资源,有效提升效率.
以上就是python使用多线程备份数据库的步骤的详细内容,更多关于python 多线程备份数据库的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/lucktomato/p/14826115.html 。
最后此篇关于python使用多线程备份数据库的步骤的文章就讲到这里了,如果你想了解更多关于python使用多线程备份数据库的步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是在项目中使用 keras 的新手。我一直在我的模型中使用generator。 我真的很困惑我应该输入什么值 1) In fit_generator : steps_per_epoch & vali
假设我们有如下情况: A has to give $10 to B. B has to give $20 to C. C has to give $10 to D. 现在这种情况可以简化为: A lo
我正在尝试对特定列(在工作表“OA”中)进行相对引用,我需要在 110 的步骤中检索新工作表中的单元格内容 例如, =OA!$AB217 =OA!$AB327 =OA!$AB437 与其在每个单元格中
我的 PowerShell 控制台启动时间很慢(总是等待超过 5 秒),并且希望获得有关故障排除步骤的建议,以找出瓶颈可能在哪里? 我已经阅读了关于运行脚本的内容,-NoProfile防止模块等加载很
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
这是我的code : &n
为什么 (2) c.ERR(模棱两可)?第一个方法参数 - char ('a') 被扩展为 float => 匹配。 如果找到匹配项,是否无需继续执行第 2 步(装箱/拆箱)或第 3 步(尝试可变参数
我有一个函数,它处理一个包含 6100 个列表项的列表。当列表只有 300 个项目时,该代码可以正常工作。但是立即与 6100 崩溃。有没有一种方法可以遍历这 6100 个项目,一次说 30 个,然后
1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装
我创建了一个类似于 primeNG page 的步骤组件我想把他放在一个 dynamic dialog 里面但在应用它之后,“第 1 步”和“第 2 步”不会呈现。 查看代码,我发现关键部分是我们打开
我在理解描述的 MixColumns 步骤时遇到问题 here . 我知道扩散,这一切都是有道理的,因为它指出每列都被视为多项式并乘以 GF(2^8) 的模。 但是..乘以GF(2 ^ 8)。尽管域仍
根据我对 TeamCity 工作原理的观察,我注意到在所有步骤执行完毕后评估构建失败条件。这很烦人,因为如果满足任何构建失败条件,我不能有一个不会执行的步骤。 我不是指常见的构建失败条件,例如“至少一
基于这篇试图在我的环境中测试管道代码的帖子。但它给出了以下错误消息。如何修复他的管道代码? ERROR: Unable to find project for artifact copy: test
我参与了一个项目,需要向我的一位同事提供生产数据的子集(日期范围),以进行故障排除。我想将经过清理的生产数据子集插入新的数据库表中我的同事可以访问。请提出实现此目标的最佳方法。 最佳答案 最简单的方法
我有这样的场景: 鉴于我去这个页面 当我输入 cucumber 时 然后我点击 然后我应该看到文字 我不应该看到这条线 如果我运行这个场景,它将执行所有 5 个步骤。但是我想跳过第4步(然后我应该看到
是否有任何功能可以避免 m 文件的绘图输出? 我的意思是我在文件的开头放置了一个函数(如 clc),然后所有绘图函数都被阻止。 最佳答案 您可以使用自己的(嵌套在您的函数内或同一目录中)重载内置绘图函
我是小 cucumber 语言的新手,这在我看来是非常基本的问题,但我找不到答案。 我知道可以在 Gherking 中编写多行步骤参数,如下所示: Given a blog post named "R
即使其中一个步骤失败,有没有办法继续执行 Cucumber Steps。在我当前的设置中,当一个步骤失败时, cucumber 会跳过剩余的步骤......我想知道是否有某种方法可以设置 cucumb
start-step-stop 码是一种数据压缩技术,用于压缩相对较小的数字。 该代码的工作原理如下:它具有三个参数,start、step 和 stop。 Start 确定用于计算前几个数字的位数。
我是一名优秀的程序员,十分优秀!