一. 信号量
同进程的一样
Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
实例:(同时只有5个线程可以获得semaphore,即可以限制最大连接数为5):
from threading import Thread,Semaphore
import time,random
sm=Semaphore(5)
def task(name):
sm.acquire()
print('%s 正在上厕所' %name)
time.sleep(random.randint(1,3))
sm.release()
if __name__ == '__main__':
for i in range(20):
t=Thread(target=task,args=('路人%s' %i,))
t.start()
上文代码中将一个个线程比喻成了 正在上厕所 ,而我们知道一个厕所能同时使用的人数是一定的,只有当里面出来一个人,下一个才能进去,这就是信号量的概念!
二. Event事件
指的是有两个自定义线程 ,线程一 , 线程二 :
线程二执行的前提必须是线程一代码完完整整执行完毕后才执行线程二
这种事件称之为Event事
示例代码
from threading import Thread,Event
import time
event=Event()
def light():
print('红灯正亮着')
time.sleep(3)
event.set() #绿灯亮
def car(name):
print('车%s正在等绿灯' %name)
event.wait() #等灯绿
print('车%s通行' %name)
if __name__ == '__main__':
# 红绿灯
t1=Thread(target=light)
t1.start()
# 车
for i in range(10):
t=Thread(target=car,args=(i,))
t.start()
有两个线程: 红绿灯 和 车
车线程想要通过红绿灯必须要红绿灯线程执行完毕,红灯变成绿灯时才能执行
三. 线程Queue
queue.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())
# 输出结果为 :
1
2
3
queue.LifoQueue() #后进先出->堆栈
import queue
q=queue.LifoQueue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
# 输出结果为 :
3
2
1
queue.PriorityQueue() #优先级
优先级,优先级用数字表示,数字越小优先级越高
import queue
q=queue.PriorityQueue(3)
q.put((10,'a'))
q.put((-1,'b'))
q.put((100,'c'))
print(q.get())
print(q.get())
print(q.get())
# 输出结果为 :
(-1, 'b')
(10, 'a')
(100, 'c')