Python基础知识点回顾(4)
多任务-线程知识点回顾:
- 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)
- 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的
线程用到的模块:threading
多线程简单例子:
#coding=utf-8 import threading import time def saySorry(): print("亲爱的,我错了,我能吃饭了吗?") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=saySorry) t.start() #启动线程,即让线程开始执行
注意:当调用start()
时,才会真正的创建线程,并且开始执行
多线程共享全局变量
优点:方便在多个线程间共享数据
缺点:线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)(资源竞争)
同步:
同步就是协同步调,按预定的先后次序进行运行
如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B执行,再将结果给A;A再继续操作。
互斥锁:
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制,线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。
锁的好处:
-
- 确保了某段关键代码只能由一个线程从头到尾完整地执行
锁的坏处:
-
- 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
- 由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
死锁:
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
避免死锁:
- 程序设计时要尽量避免(银行家算法)
- 添加超时时间等
多任务-进程知识点回顾:
进程的状态:就绪、执行、等待
进程的创建-multiprocessing
进程的通信-Queue
进程池-Pool
多任务-协程知识回顾:
协程是python个中另外一种实现多任务的方式
协程-yield
协程-greenlet
协程-gevent
进程、线程、协程对比:
- 进程是资源分配的单位
- 线程是操作系统调度的单位
- 进程切换需要的资源很最大,效率很低
- 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)
- 协程切换任务资源很小,效率高
- 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发