小白学python-----------------并发编程之线程Queue,信号量,Event

 一.线程Queue

import queue

# 队列 ==>先进先出
q = queue.Queue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())


# 堆栈==>先进后出
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())


#优先级队列:优先级高先出来,数字越小,优先级越高,要以元组的方式放进去
q = queue.PriorityQueue()
q.put((10,'data1'))
q.put((-10,'data2'))
q.put((0,'data3'))
print(q.get())
print(q.get())
print(q.get())

二.信号量

信号量是控制同一个时刻并发执行的任务数

from threading import Thread,Semaphore,current_thread
import time,random


sm = Semaphore(5)#指定同一时刻的任务数

def task():
    with sm:
        print('%s 正在上厕所'%current_thread().name)
        time.sleep(random.randint(1,4))



if __name__ == '__main__':
    for i in range(20):
        t = Thread(target=task)
        t.start()

三.Event

线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,,我们需要使用threading库中的Event对象。

Event对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。

在初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。

一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。

如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行。


event.isSet():返回event的状态值;

event.wait():如果 event.isSet()==False将阻塞线程

扫描二维码关注公众号,回复: 3210784 查看本文章

event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度

event.clear():恢复event的状态值为False

猜你喜欢

转载自blog.csdn.net/qq_42721964/article/details/82496788