老规矩,先理解概念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的时候,他的子线程则结束
协程