#1、信号量,用来保证多个线程不会互相冲突。 #2、迷你唱吧:每次只能有两人在里面唱k: from threading import Thread from threading import Semaphore import time import random def sing(i,sem): sem.acquire() print('%s拿到钥匙进入房间唱K'%i) time.sleep(random.randint(3,6)) #睡眠是为了看效果 print('%s从房间出来了'%i) sem.release() sem = Semaphore(2) #有两把钥匙,受到钥匙的限制,5个线程不能同时执行,同一时间只能有2个线程在执行,其他在等着。 for i in range(5): #5人唱k,5个任务,开启5个线程。 t = Thread(target=sing,args=(i,sem)) t.start() # 0拿到钥匙进入房间唱K # 1拿到钥匙进入房间唱K # 1从房间出来了 # 2拿到钥匙进入房间唱K # 0从房间出来了 # 3拿到钥匙进入房间唱K # 3从房间出来了 # 4拿到钥匙进入房间唱K # 2从房间出来了 # 4从房间出来了 #3、信号量和线程池的区别: # 1.信号量:有几个任务就开几个线程,因为受到锁的限制,线程(任务)不能同时执行。 # 例如有两把锁执行5个线程(任务),每次只能有两个线程(任务)在执行,其他在等待。 # 线程池:可以设置线程的数量去轮流执行它的任务:例如设置2个线程去轮流执行5个任务。 # 每次只能有两个任务在执行,其他在等待。