描述:
生产者:四个
消费者:六个
缓冲区:五个
某一时刻只能有一个线程或进程访问缓冲区,缓冲区没满时生产者可以往里面放东西,缓冲区没空时消费者可以从里面取东西。
信号量:
设置三个信号量,一个信号量判断缓冲区是否被占用,一个信号量判断缓冲区是否有空,最后一个信号量判断缓冲区里是否有东西。
实现:
import queue,random,threading
from time import sleep
s_1 = threading.Semaphore(1) # 临界区互斥信号量
s_2 = threading.Semaphore(5) # 判断是否有空闲缓冲区的信号量
s_3 = threading.Semaphore(0) # 判断缓冲区里是否有产品的信号量
def productor(i, q):
while True:
num = random.choice(['华为P30', '小米9', 'ViVo x27', 'iphone XR'])
print('生产者%d生产了产品%s' % (i, num))
s_2.acquire() # 是否有空缓冲区
s_1.acquire() # 缓冲区是否被占用
q.put(num)
sleep(1)
print('生产者%d把产品%s放入了仓库中' % (i, num))
s_1.release()
s_3.release()
def consumer(i, q):
while True:
s_3.acquire()
s_1.acquire()
num = q.get()
sleep(1)
print('消费者%d购买了产品%s' % (i, num))
s_1.release()
s_2.release()
if __name__ == '__main__':
q = queue.Queue(5) # 创建上限为5的缓冲区
# 创建4个生产者
for i in range(4):
threading.Thread(target=productor, args=(i, q)).start()
# 创建6个消费者
for i in range(6):
threading.Thread(target=consumer, args=(i, q)).start()
运行结果:

关于P、V操作实现司机和售票员的问题:https://blog.youkuaiyun.com/qq_40760732/article/details/89513663
关于Python的进程创建:https://blog.youkuaiyun.com/qq_40760732/article/details/89386162
关于Python的多进程操作:https://blog.youkuaiyun.com/qq_40760732/article/details/89408885
关于Python的书籍:https://download.youkuaiyun.com/download/qq_40760732/11102995