一、Event
1、为什么会有Event?
线程的一个关键特性就是每个线程的运行都是独立运行且状态不可预测。如果程序中的线程需要通过别的线程的状态来判断自己线程中的 某个程序是否需要执行,那么Event就产生了。
2、Event的作用?
threading库中Event对象主要是通过判断自己线程中的Event对象来判断是否唤醒所等待这个Event对象的线程,Event对象包含一个可由 线程设置的信号标志,默认情况下该信号标志为假,如果有别的线程等待这个Event对象时,当他为假时那么这些被等待的线程将一直被阻塞 直到Event对象为真时才会继续执行。如果这个信号标志为真了那么别的线程就会忽略它而继续执行程序。
3、Event的使用方法
event=threading.Event() #实例化产生一个Event的对象
event.isSet(): #返回event的状态值;
event.wait(): #如果 event.isSet()==False将阻塞线程;
event.set(): #设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
event.clear(): #恢复event的状态值为False,默认情况下就是为Flase。
4、如图:
线程1 线程2
注释:在多个线程中,当有线程1出现Event.wait()时会判断线程2中Event.isSet()的状态,如果为True,线程1继续执行程序,如 果为Flase,线程1会等待线程2中Event.set()状态设置为True后再继续执行程序。
线程1是否能执行完毕程序依赖于线程2的Event对象是否为真
5、如图实例:
6、event.wait()方法还支持添加一个超时参数,默认线程会等待event.isSer()为True时才会执行下面代码,但是设置了超时参数后,当线程 等待超过这个时间就会自动执行下面的代码。
二、队列
1、什么是队列?
数据进行有序的处理,相当于按照顺序处理数据。
2、get()和put()方法
1.get()是发送数据,put()是接收数据,可以在实例化产生对象的时候设置消息队列的长度,即queue.Queue(100).
2、实例:
注释:该方法是按照先进先出的机制来处理数据的,即先进来的数据现得到处理。
2、join()和task_done()
1.如图所示
2.其他用法
q.qsize() 返回队列的大小 q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)非阻塞
q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,
q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作
3、其他模式
1、Python Queue模块的FIFO队列先进先出。class queue.Queue(maxsize)
2、LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize)
3、还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)