今天我们继续深入,一起学习python中的线程相关知识。
目录
1paramiko模块
2 多线程、多进程
3 使用多线程 threading
1 paramiko模块
堡垒机准备
paramiko:基于ssh用于连接远程服务器并执行相关操作,批量管理
安装
1.1 SSHClient 基于用户名密码连接
基于用户名密码连接 执行命令:
基于用户名密码连接 传输文件:
1.2 SSHClient 基于密钥连接
基于公钥密钥连接 执行命令
基于公钥密钥连接 传输文件
2 多线程、多进程
2.1 什么是线程(thread)?
2.2 什么是进程(process)?
2.3 线程和进程的区别
关系
速度
创建
交互
3. 使用多线程 threading
3.1 线程调用的两种常用方法
直接调用
继承式调用
上面是一行一行输的启动线程,那么如果一下启动很多线程呢?
上面的代码打印执行时间才零点几秒,不是应该2秒么?
3.2 线程的执行
那么,我如果想等所有子线程执行结果怎么办?
join()等待(等待 线程结束)
守护线程
什么是守护线程呢,比如皇帝有很多仆人,当皇帝死了之后,那么多仆人就得陪葬。
只要非守护线程结束了,不管守护线程结束没结束,程序都结束
GIL 全局解释器锁
例如 4核机器上, python创建4线程,四个线程均匀分到多核上,但是同时只能一核在处理数据。
python调用操作系统、C语音的原生接口,在出口做了设置。全局解释器锁,保证数据统一
所以有人说python的线程是假线程。
在修改数据的时候,为了防止数据改乱了,所以多线程就变成串行处理,但是以为是python在处理,实际上是调用了操作系统的C语音的线程接口,所以中间的过程,python控制不了了,只知道结果。在这种情况下,设置的方式是出口控制,虽然四个线程,但是同一时间只有一个线程在工作。
所以这算是python的一个缺陷,但是也不能说是python的缺陷,是Cpython的缺陷。因为Cpython是C语音写的,以后python的未来是PYPY
线程锁
线程锁,又叫互斥锁
线程之间沟通:保证同一时间只有一个线程修改数据
python 2.x 中需要加锁,
python 3.x 中加不加都一样,解释器做了优化
可以在linux\python2下尝试一下代码,可能会遇到数值修改错误的问题
注意:这里这个锁和全局解释器锁没有关系,这是用户程序自己的锁,用户态的锁。
通过上图可以看出,全局解释器锁:是出口加锁给OS,线程锁是返回数据修改原数据加锁。
RLock(递归锁)
大锁中还有小锁,递归锁,解锁时就混了,所以用递归锁,Rlock()
信号量
互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。
事件events
线程之间交互。就是在设置一个全局变量,线程之间通信。
下面写一个模拟红绿灯的例子:
queue 队列
队列作用:
增加双方的效率, 完成了程序的解耦,松耦合
队列可以理解为一个容器,容器就是放数据的,不过队列是有顺序的,那列表、字典也是容器,有它们了,为什么还要队列啊?队列和列表最直接的区别是什么呢?
你从列表中取出来一个数据之后,数据还在列表里,只是拷贝了一份,而队列取走了就没了。
队列的几个方法
使用
设置优先级
生产者消费者模型
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
下面来学习一个最基本的生产者消费者模型的例子:
声明:本文系网络转载,版权归原作者所有。如涉及版权,请联系删除!
领取专属 10元无门槛券
私享最新 技术干货