# 生产包子和消费包子模型,一对多 线程(threading),队列(queue) 先入先出FIFO
# 线程之间不直接通信(queue阻塞,缓冲区)
# 队列方法
# Queue.Queue(maxsize=0)
# FIFO, 如果maxsize小于1就表示队列长度无限
# Queue.LifoQueue(maxsize=0)
# LIFO, 如果maxsize小于1就表示队列长度无限 先入后出
# Queue.qsize()
# 返回队列的大小
# Queue.empty()
# 如果队列为空,返回True, 反之False
# Queue.full()
# 如果队列满了,返回True, 反之False
# Queue.get([block[, timeout]]) 读队列,timeout等待时间
# Queue.put(item, [block[, timeout]]) 写队列,timeout等待时间
# Queue.queue.clear() 清空队列
import queue, threading, random, time
q = queue.Queue(maxsize=10) # 限制最大生产数 FIFO
def sheng():
count = 0
while True: # 死循环生产者一直生产
time.sleep(1)
q.put(count) # 放入队列
print("生产第{0}个包子".format(count))
if q.full(): # 判断队列是否溢出
print("队列满了")
# q.join() # 阻塞 当加了队列溢出,队列将一直处于阻塞状态,将不会生产
count += 1
def xiao(name):
count = 0
while True:
time.sleep(1)
if not q.empty(): # 判断队列是否为空
data = q.get() # 队列内取数据
# q.task_done()
# q.join()
print(data)
print('\033[32;1m消费者 %s 消费了第 %s 个包子...\033[0m' % (name, data))
else:
print("-----暂时没得包子了----")
count += 1
if __name__ == "__main__":
s1 = threading.Thread(target=sheng,)
x1 = threading.Thread(target=xiao, args=("Wang",))
x2 = threading.Thread(target=xiao, args=("Li",))
s1.start()
x1.start()
x2.start()
deque 与 queue 区别参照 https://www.cnblogs.com/MY0213/p/8997461.html
多线程多进程参照 https://www.cnblogs.com/yuanchenqi/articles/6755717.html