python自动化运维之多线程

简介:

1、Python中的多线程
执行一个程序,即在操作系统中开启了一个进程,在某一时刻,一个CPU内核只能进行一个进程的任务,现在的计算机所说的多进程/多任务其实是通过加快CPU的执行速度来实现的,因为一个CPU每秒能执行上亿次的计算,能够对进程进行很多次切换,所以在人为可以感知的时间里,看上去,计算机确实是在同时执行多个程序,即同时处理多个进程。

一个进程中可以包含有多个线程,这多个线程为实现该进程的某个主要功能而运行着,多个线程可以进行串行工作,也可以并发同时进行工作,显然后者可以节省更多的时间。

在Python中是支持多线程并发执行的,只是Python中的多线程只能利用单核,也就是说Python中的某一个进程的多个线程只能在一个CPU核心上运行,而不能分配在多个CPU核心中运行,这是考虑到线程安全的缘故,而Python中的GIL则保证了线程安全。关于Python中的GIL,可以参考文章:《浅析Python的GIL和线程安全》。
即GLI是以CPU核心为单位来控制全局锁,所以是不能跨不同的CPU(核心 )的
GLI可以保证同一个进程中,某一个线程的共享数据在某一时刻只能同时被另外一个线程修改(使用),
而不能同时被多个线程修改(使用),如果去掉GLI,则需要自己为线程加锁,这样之后,性能比原来还要差。
当然,难道就不能充分利用多核CPU或多个CPU了?
做成多进程就可以了,不同的进程运行在不同的CPU(核心)上,也可以实现并发,
只是这样的话就会比较浪费内存空间,考虑同时运行10个QQ程序的情况,
假如1个QQ占用500M的内存空间,则10个QQ就要占用5G的内存空间了。但如果是多线程的话,
可能10个QQ还是共享着这500M的内存空间。还有一个缺点就是,多进程间的数据直接访问可能
会比较麻烦,但其实也是可以实现的,比如chrome浏览器就是用多进程实现的。
目前首先要明确的是,Python中是不能把一个进程的多个线程分布在不同的CPU核心上运行的。
2、Python多线程使用方法1
给出下面的程序代码及注释:

1
2
3
4
5
6
7
8
import  threading     # Python多线程模块
import  time
def run(num):
     print( 'Hi, I am thread %s..lalala'  % num)
      time . sleep (20)
for  in  range(20):
     t = threading.Thread(target=run, args=(i,))    # 多线程使用方法,target为需要执行多线程的函数,args为函数中的参数,注意这里的参数写成(i,),即如果只能一个参数,也要加上一个","
     t.start()     # 开始执行多线程

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hi, I am thread 0..lalala
Hi, I am thread 1..lalala
Hi, I am thread 2..lalala
Hi, I am thread 3..lalala
Hi, I am thread 4..lalala
Hi, I am thread 5..lalala
Hi, I am thread 6..lalala
Hi, I am thread 7..lalala
Hi, I am thread 8..lalala
Hi, I am thread 9..lalala
Hi, I am thread 10..lalala
Hi, I am thread 11..lalala
Hi, I am thread 12..lalala
Hi, I am thread 13..lalala
Hi, I am thread 14..lalala
Hi, I am thread 15..lalala
Hi, I am thread 16..lalala
Hi, I am thread 17..lalala
Hi, I am thread 18..lalala
Hi, I am thread 19..lalala

直接看执行结果是看不出什么的,这里说一下这个程序的执行过程:0到19是同时打印输入的,在打印19后,程序sleep 1秒后才结束程序的运行。
上面这个程序有20个线程执行,每个线程都是:打印字符串+sleep(20)。我们实际看到的结果是0到19同时打印,然后才sleep 20秒,但是需要注意的是,并非是20个线程才执行一次sleep(20),而是在每个线程中都执行了一次sleep(20),即该程序实际上是执行了20次sleep(20),而我们实际看到的结果是程序运行时仅仅是暂停了1秒,那是因为这20次sleep(20)是并发执行的。
上面的程序可以这么去理解:20个线程相当于有20匹马,20匹马同时起跑(打印字符串),然后以同时停20秒(sleep(20)),最后同时到达终点(20个线程运行结束,即程序执行结束)。
为了更好的理解上面的程序,可以把上面的代码改为如下:

1
2
3
4
5
6
7
8
9
import  threading
import  time
def run(num):
     print( 'Hi, I am thread %s..lalala'  % num)
     time . sleep (20)
for  in  range(20):
     t = threading.Thread(target=run, args=(i,))
     t.start()
     t. join ()     #等上一个线程执行完后再执行下一个线程

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hi, I am thread 0..lalala
Hi, I am thread 1..lalala
Hi, I am thread 2..lalala
Hi, I am thread 3..lalala
Hi, I am thread 4..lalala
Hi, I am thread 5..lalala
Hi, I am thread 6..lalala
Hi, I am thread 7..lalala
Hi, I am thread 8..lalala
Hi, I am thread 9..lalala
Hi, I am thread 10..lalala
Hi, I am thread 11..lalala
Hi, I am thread 12..lalala
Hi, I am thread 13..lalala
Hi, I am thread 14..lalala
Hi, I am thread 15..lalala
Hi, I am thread 16..lalala
Hi, I am thread 17..lalala
Hi, I am thread 18..lalala
Hi, I am thread 19..lalala

执行结果看上去跟前面是一样的,但执行过程却是这样的:每打印一次字符串,再暂停20秒。
通过这个程序,也就可以更好的理解Python的多线程并发执行了,当然,因为这是一个动态的过程,所以把程序执行一遍后会有更好的理解。
3、Python多线程使用方法2

1
2
3
4
5
6
7
8
9
10
11
import  threading, time
class MyThread(threading.Thread):
     def __init__(self, num):
         threading.Thread.__init__(self)
         self.num = num
     def run(self):  #this name must be 'run'
         print( 'I am thread %s'  % self.num)
         time . sleep (2)
for  in  range(20):
     t = MyThread(i)
     t.start()

程序的执行结果与方法1是一样的,这里就不给出了,只是这里利用了面向对象编程的思想方法来设计程序代码。



本文转自 炫维 51CTO博客,原文链接:http://blog.51cto.com/xuanwei/1961458

相关文章
|
2天前
|
存储 Python 容器
在Python中,如何处理线程内的变量
在Python中,如何处理线程内的变量
|
17天前
|
运维 数据安全/隐私保护 Python
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
Python基于telnetlib模块实现交换机全面巡检自动化运维项目
48 14
|
11天前
|
安全 Python
在Python中,实现多线程
【7月更文挑战第16天】在Python中,实现多线程
25 6
|
9天前
|
监控 安全 调度
在Python中,线程管理
【7月更文挑战第18天】在Python中,线程管理
10 3
|
9天前
|
开发者 Python
Python线程
【7月更文挑战第18天】Python线程
14 2
|
9天前
|
Python
Python线程是操作系统能够进行运算的最小单位
【7月更文挑战第18天】Python线程是操作系统能够进行运算的最小单位
10 1
|
12天前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
12天前
|
监控 jenkins 持续交付
Python进行自动化
【7月更文挑战第9天】 Python在自动化部署中发挥关键作用,提供如Fabric、Ansible、Docker SDK和Kubernetes Client等工具。自动化部署提高效率、减少错误,确保部署一致性和可控性。例如,Fabric库简化了远程服务器的部署任务,如在多台服务器上执行Git拉取和Docker容器启动。持续集成/部署(CI/CD)结合Jenkins和Fabric,实现代码变更自动构建、测试和部署。监控和持续改进是确保应用稳定性和质量的关键,通过定期回顾、度量分析以及有效监控系统来优化流程。
18 1
|
14天前
|
缓存 并行计算 监控
了解 Python 线程
【7月更文挑战第8天】在Python多线程编程中,`threading`模块允许我们获取当前线程名字,通过`current_thread().name`获取。线程名字有助于调试、日志和资源管理。示例代码展示了如何创建线程并打印其名字。在实际应用中,线程命名应清晰、唯一且避免特殊字符,以提高代码可读性和维护性。多线程编程需注意线程安全、死锁、性能优化等问题。通过合理设计和测试,可以利用多线程提高程序并发性和效率。
20 1
|
17天前
|
数据采集 存储 监控
python 10个自动化脚本
【7月更文挑战第10天】
37 3