python-进程&线程&协程

老规矩,先理解概念python

冯诺依曼体系:算法

  输入设备:键盘、鼠标安全

  存储器:内存多线程

  输出设备:显示器、投影仪、打印机ide

 

程序:一个包含了代码片被编译后的文件函数

进程:系统经过解析程序文件加载到内存中的对象,进程是资源分配和调度的基本单位(分配cpu, 分配内存大小,它由系统进行调度),进程中包含指令(if, for…)、数据(变量,函数…)、线程(他也是线程的容器),他是操做系统结构的基础。ui

线程:进程中真正干活的人,线程是资源调度的最小单元,是程序执行流的最小单元,线程中包含线程id当前指令的指针(线程会切换,再次运行还能从阻塞的位置继续),寄存器集合(线程切换,这个线程执行的结果进行暂存)、堆栈(栈是先进后出,执行一个函数要先生成函数对象->函数压栈->变量引用压栈->调用函数->弹出栈顶,线程执行的其实也就是函数,从Thread的target参数就能看出来,它接收的是一个函数或则方法)spa

进程操作系统

注释:线程

1:每个进程都认为本身独占全部的计算机硬件资源()

2: 进程间不共享数据(这里就要解决进程间通讯的问题)

线程

注释:上边已经大体讲了一下线程,这里再说一下线程的特色

1:一个进程中能够有多个线程,同一个进程中的线程共享数据资源(这里须要学好python中的做用域,由于python是用做用域来控制进程中的资源。另外就是先作一个预热,既然共享资源就会出现线程安全的问题)

2:每个线程拥有本身独立的堆栈。

3:线程的几种状态(就绪:处于没有结束,也没有在执行中间的一个状态。运行:正在执行代码片。阻塞:它在等待系统的处理结果,好比系统在执行IO。 终止:执行完成或则退出或则被取消)

4:python线程没有优先级、没有线程组的概念。

python-线程开发(threading库)

threading的属性和方法

方法 注释
current_thread() 获取当前线程对象
main_thread() 获取主线程对象
active_count() 获取在运行的线程个数
enumerate() 获取主线程+未结束的线程对象
get_ident 获取当前线程的id

 

 

 

 

 

 

Thread类->线程对象

Thread(target, name, args, kwargs)

 

Thread对象的方法

Thread对象方法 注释
name 对象的名字
ident 对象的id
is_alive() 对象是否已经结束

 

 

 

 

 

启动: start()与run()

start() 启动线程惟一的方法,start调用run方法
run() 在当前线程执行函数调用,没有开启新的线程

 

 

 

结束:python没有提供线程终止的方法

编号 终止的方法
1 被执行的代码片中出现了异常
2 线程执行完成
3 对于循环的代码片捕获到某个编辑break了

 

 

 

 

 

线程安全:线程安全指的是,执行一段代码或者调用一个函数,不会返回不肯定的结果

python中解决线程安全的方法:

1:使用线程安全的库,或则使用线程安全的函数(python中的内置数据类型多数都是线程安全的,这样对开发者也是有好处的,好比你在使用python并行开发的时候不用去考虑线程安全的问题,固然也有他的弊端)

  注释:好比print就是一个线程不安全的函数,他在多线程中执行的时候会被打断(也就是cpu进行线程切换),那么你就可使用线程安全的库或则函数来替代,好比使用logging.info()来打印。

2:使用threading.lock()进行加锁处理(在任何一门语言中,并行开发中,锁的使用能规避则规避,由于锁的使用要考虑不少的问题,好比死锁,好比阻塞,好比加锁解锁的开销,再好比须要技术大牛设计一个好的程序例如银行家算法)

 

Thread类的daemon参数

一个进程中,必定有一个线程,这个线程就称为主线程,咱们使用Thread类建立的线程称为子线程,主线程daemon=False(也就是说他是一个non-daemon线程),咱们开启的子线程若是没有指定这个参数,那么子线程默认继承主线程的daemon=False,这个False有什么做用呢,他的做用就是,假如只有一个子线程而且子线程为non-daemon线程,那么主线程就会等待子线程结束再结束(结束不等于退出,你能够用threading.enumerate()打印看一下主线程为stop状态,可是并无退出,主线程退出整个进程就结束了),假如这个惟一的子线程为daemon线程,那么主线程结束,这个子线程就会结束了。第二种状况,假如这个进程中有多个子线程,只要有一个子线程为non-daemon线程,那么主线程就会等待这个子线程结束再结束,若是为daemon的线程没有执行完,这个为daemon的线程也会随着主线程的结束而结束。

名称 含义
daemon属性 表示线程是不是daemon线程, 这个值必须在star()以前设置,不然报RuntimeError异常
isDaemon() 是不是daemon线程
setDaemon 设置为daemon线程,必须在start()方法以前设置

 

 

 

 

 

daemon=True的应用场景,你不关心这个线程执行的代码片是否必须执行完成。

Thread类对象的join方法

t.join()表示,谁执行t.join()这几行代码,那么谁就要等待t,这个时候,因为主线程/父线程没有退出,那么子线程即便为daemon线程,子线程也不会退出(由于子线程daemon的退出是父线程退出了才会quit这个线程)。

 

 

threading.local()

threading.Timer()

注释:线程延时执行,他本质上是一个线程类,和线程的使用方法同样,无非是等待一段时间执行,可是他提供了一个cancel()方法,在执行到cancel的时候,他的子线程则结束

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

协程

相关文章
相关标签/搜索