python学习笔记——玖

模块

improt paramiko

Linux连接客户端

import paramiko

  

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect("某IP地址",22,"用户名", "口令")

stdin, stdout, stderr = ssh.exec_command("你的命令")

print stdout.readlines()

ssh.close()

Linux下载 上传文件

 

如果报错,取消注释

通过 代码ssh 通过公钥 连接linux客户端

多线程

 

类的方式启动线程

 同时创键50个线程

参数不一样就代表是不同的线程

 

线程等待 join()

下图 代表t1执行完 后再执行下边的代码

统计所有线程都执行完所用的时间

创建一个列表 把所有的线程引用都加进列表

然后循环列表 执行join

 

打印当前线程

主线程打印如下

子线程的打印如下

查看当前活动的线程

如下输出 51

守护线程,服务于主线程。主线程执行完毕,守护线程立刻退出,不管是否执行完毕。

但守护线程先执行完毕,就不会等待主线程。

 

下图 setDaemon(True) 设置线程为守护线程

注意:设置要写在 start()前边

python解释器

 

cpython 解释器

python在同一时间只会有一个线程在执行

例如 变量num 如果4个线程同时加1,可能造成结果混乱。所以有个全局解释器锁(gil)。保证了同一时间只有一个线程在执行。

 

pypy解释器(python的未来)

去掉了全局解释器锁,并且加入了即时编译功能,就是提前预编译一部分代码。所以速度很快

 

线程锁(互斥锁)

虽然有 全局解释器锁(git),但是多线程并发执行 因为线程的内存是共享的 所

对一个变量修改的时候依然会造成数据混乱。

保护一段代码,每次只能被一个线程运行。

 

lock=threading.Lock 创建锁对象

lock.acquire  得到锁

lock.release()释放锁

 

递归锁

当有多个锁嵌套时。会导致锁混乱,造成死循环。这时用到递归锁 RLock

可解决此类问题。

全局解释锁(GIL)

同一时间只会有一个线程在执行

giL并不是python的特性,而是python解释器,CPython引入的一个概念。因为

CPython是python的默认解释器,所以在很多人的概念里CPython就是python,

GIL归结为python的缺陷。但其实 jpython 和 pypy都没有GIL的概念。

计算任务 包含计算密集型和Io密集型

计算密集型的特点是进行大量的计算,复杂的加减乘除,视频解码,全靠cpu的运算能力。所以代码的运算效率非常重要,python这样的脚本语言运行效率比较低,不太适合计算密集型任务,最好是用c语言写。

IO密集型 的特点是 磁盘IO,网络IO占主要的任务。对CPU的消耗很少。这于这种任务,开发效率的语言就非常适合。比如Python,c语言就表现的差一些。

GIL只会影响到那些严重依赖CPU的程序,比如计算密集型的。

信号量

保护一段代码 允许有限数目的线程,去执行一段代码。

例如线程池。例如你的程序,被几个人访问。

线程锁和信号量,都是为了保护一段代码。

区别是: 数据锁只允许一个线程执行,信号量可以指定多个线程。

 

Events 事件 4个方法

event.set() #设置标志位

event.clear()#清空标志位

event.is_set() #判断标志位是否被设置

event.wait()#阻塞状态

红绿灯

车的代码 以及启动线程

队列

python自带的队列

容器

利于多线程处理任务,完成程序的解耦 生产者和消费者只和队列有关系

 

 

列表和队列的区别

列表取出数据 数据还在列表中

队列取出数据 数据只有一份,取走就没有了

 

 

先入先出 常用

q=queue.Queue(参数可选)

     maxsize=3  设置队列的容量  默认无限容量

 

后入先出     

q=queue.LifoQueue(参数同上 )

 

可设置优先级的队列

q=queue.PriorityQueue(参数同上)

  添加数据时,是个元组。数值小的会被先取到

put(数据) 添加数据

get(可选参数)  获取数据 取不到数据

     block=True  默认是True会阻塞 改成false不会阻塞

timeout=1   可设置阻塞时间

get_nowait() 获取数据 取不到数据,会报错

qsize() 获得队列的数据量

 

 

 

原文地址:https://www.cnblogs.com/HL-blog/p/7622261.html