Event事件
Event事件的作用:用来控制线程的执行
由一些线程去控制另一些线程
线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就变的非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象,而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果讲一个Event对象的信号表中设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件,继续执行。
from threading import Event
event.isSet():返回event的状态值
event.wait():如果event.isSet()==False将阻塞线程
event.set():设置event的状态值为true,所有阻塞池的线程激活进入就绪态,等待操作系统调度
event.clead():恢复event的状态值为false
e = Event():调用Event类实例化一个对象,该标志最初为假
e.wait():若该方法出现在任务中,则为false,阻塞
e.set():若该方法出现在任务中,则将其他线程的false改为true,进入就绪态与运行态
例如,有多个工作线程尝试链接MySQL,我们想要在链接前确保MySQL服务正常才让那些工作线程去连接MySQL服务器,如果连接不成功,都会去尝试重新连接。那么我们就可以采用threading.Event机制来协调各个工作线程的连接操作
进程池与线程池
什么是进程池与线程池
进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量
进程池与线程池的作用
保证在硬件允许的范围内创建(进程/线程)的数量
在刚开始学多进程或多线程时,我们迫不及待的基于多进程过多线程的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目的增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程或线程加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途,例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对于开启进程的数目加上限制
高性能爬取梨视频
利用线程池异步提交任务
协程
协程:在单线程下实现并发
注意:协程不是操作系统资源,他是程序起的名字,为让单线程能实现并发
协程的目的:
多道技术 ,切换+保存状态
遇到IO
CPU执行时间过长
通过手动模拟操作系统“多道技术”,实现 切换+保存状态
手动实现 遇到IO切换,欺骗操作系统误以为没有IO操作
单线程 遇到IO,切换+保存状态
优点:在IO密集型的情况下,回提高效率
缺点:若计算密集型的情况下,来回切换,反而效率更低
如何实现协程:切换+保存状态
yeild:保存状态
并发:切换