简述生产者消费者模型

# 生产包子和消费包子模型,一对多 线程(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('33[32;1m消费者 %s 消费了第 %s 个包子...33[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
原文地址:https://www.cnblogs.com/jum-bolg/p/10915632.html