zoukankan      html  css  js  c++  java
  • 【LenmoCK】Python队列基本使用(生产者消费者模型)

    作用

    解耦:使程序直接实现松耦合,修改一个函数,不会有串联关系。
    提高处理效率:FIFO=先进先出,LIFO=后进先出。
    队列
    Python四种类型的队例:
    Queue:FIFO 即first in first out 先进先出
    LifoQueue:LIFO 即last in first out 后进先出
    PriorityQueue:优先队列,级别越低,越优先
    deque:双边队列
     
     
    Queue 先进先出队列:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:FifoQueue.py
    @E-mail:364942727@qq.com
    @Time:2020/9/29 10:43 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:先进先出队列
    """
    
    from queue import Queue
    
    # 基本FIFO队列  先进先出 FIFO即First in First Out,先进先出
    # maxsize设置队列中,数据上限,小于或等于0则不限制,容器中大于这个数则阻塞,直到队列中的数据被消掉
    q = Queue(maxsize=0)
    
    # 写入队列数据
    q.put(0)
    q.put(1)
    q.put(2)
    
    # 输出当前队列所有数据
    print(q.queue)
    
    # 删除队列数据,并返回该数据
    q.get()
    
    # 输出当前队列所有数据
    print(q.queue)
    
    """
    输出:
    deque([0, 1, 2])
    deque([1, 2])
    """

    LifoOueue 后进先出队列:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:LifoQueue.py    
    @E-mail:364942727@qq.com
    @Time:2020/9/29 10:50 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:后进先出队列
    """
    
    from queue import LifoQueue
    
    # LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
    # maxsize设置队列中,数据上限,小于或等于0则不限制,容器中大于这个数则阻塞,直到队列中的数据被消掉
    lq = LifoQueue(maxsize=0)
    
    # 队列写入数据
    lq.put(0)
    lq.put(1)
    lq.put(2)
    
    # 输出队列所有数据
    print(lq.queue)
    # 删除队列数据,并返回该数据
    lq.get()
    # 输出队列所有数据
    print(lq.queue)
    
    """
    输出:
    deque([0, 1, 2])
    deque([0, 1])
    """

    优先队列:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:PriorityQueue.py    
    @E-mail:364942727@qq.com
    @Time:2020/9/29 10:53 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:优先级队列
    """
    
    from queue import PriorityQueue
    
    # 存储数据时可设置优先级的队列
    # 优先级设置数越小等级越高
    # maxsize设置队列中,数据上限,小于或等于0则不限制,容器中大于这个数则阻塞,直到队列中的数据被消掉
    pq = PriorityQueue(maxsize=0)
    
    # 写入队列,设置优先级
    pq.put((1, 'aaa'))
    pq.put((2, 'bbb'))
    pq.put((3, 'ccc'))
    pq.put((9, 'ddd'))
    
    # 输出队例全部数据
    print(pq.queue)
    
    # 取队例数据,可以看到,是按优先级取的。
    pq.get()
    print(pq.queue)
    
    """
    输出:
    [(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (9, 'ddd')]
    [(2, 'bbb'), (9, 'ddd'), (3, 'ccc')]
    """

    双边队列:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:deque.py    
    @E-mail:364942727@qq.com
    @Time:2020/9/29 10:59 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:双边队列
    """
    
    from collections import deque
    
    # 双边队列
    dq = deque(['a', 'b'])
    
    # 增加数据到队尾
    dq.append('c')
    # 增加数据到队左
    dq.appendleft('d')
    
    # 输出队列所有数据
    print(dq)
    # 移除队尾,并返回
    print(dq.pop())
    print(dq)
    # 移除队左,并返回
    print(dq.popleft())
    print(dq)
    
    """
    输出:
    deque(['d', 'a', 'b', 'c'])
    c
    deque(['d', 'a', 'b'])
    d
    deque(['a', 'b'])
    """

    生产者消费者模型:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    @File:Producter_Consumer_Model.py    
    @E-mail:364942727@qq.com
    @Time:2020/9/29 11:04 下午 
    @Author:Nobita   
    @Version:1.0   
    @Desciption:使用Queue实现生产者消费者模型
    """
    
    """
    题目:
    1.用一个队列来存储商品
    2.创建一个专门生产商品的线程类,当商品数量少于50时,开始生产商品,每次生产500个商品,每生产完一轮,暂停1秒。
    2.创建一个专门消费商品的线程类,当商品数量大于10时就开始消费,循环消费,每次消费3个,当商品实例少于10的时候,暂停2秒。
    """
    
    from threading import Thread
    from queue import Queue
    import time
    
    # 创建一个队列,用来存储商品
    q = Queue()
    
    
    # 生产者和消费者模式
    class Producer(Thread):
        """生产者"""
    
        def run(self) -> None:
            count = 0
            while True:
                if q.qsize() < 50:  # 商品数量少于50时,开始生产商品
                    for i in range(500):  # 每次生产500个商品
                        count += 1
                        goods = '--第{}个商品--'.format(count)
                        q.put(goods)
                        print('生产:{}'.format(goods))
                    time.sleep(1)
    
    
    class Consumer(Thread):
        """消费者"""
    
        def run(self) -> None:
            while True:
                if q.qsize() > 10:  # 商品数量大于10时就开始消费
                    for i in range(3):  # 每次消费3个
                        print('消费:{}'.format(q.get()))
                else:
                    time.sleep(2)
    
    
    if __name__ == '__main__':
        # 创建一个线程来生产
        p = Producer()
        p.start()
        # 创建五个线程来消费
        for i in range(5):
            c = Consumer()
            c.start()
     
  • 相关阅读:
    使用Docker及k8s启动logstash服务
    在kubernetes上部署zookeeper,kafka集群
    k8s configmap 挂载配置文件
    k8s 安装 rabbitMQ 单机版
    aws 挂载efs (nfs)目录
    长白山游记
    RedHat 安装YUM软件
    mysql查询案例
    mysql子查询
    mysql联合查询
  • 原文地址:https://www.cnblogs.com/chenshengkai/p/13752488.html
Copyright © 2011-2022 走看看