day48-线程-信号量

#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个任务。
#              每次只能有两个任务在执行,其他在等待。
原文地址:https://www.cnblogs.com/python-daxiong/p/12142781.html