• 以面向对象的形式使用线程和进程,利用队列写一个消费者模式和生产者模式


    生产者负责生产,消费者负责消费,简化工作量

    使用random库随机生成一个数来表示生产和消费的量

      线程

    from threading import Thread
    from random import randint
    from queue import Queue
    from time import sleep
    
    queue = Queue(4)    # 一个有4位的队列
    
    class Producer(Thread):
        def __init__(self, queue):
            super().__init__()  # 继承了Thread所有的方法
            self.queue = queue  
    
        def run(self):  # 改写run方法
            while True:
                item = randint(1, 99)    # 随机生成生产的量
                self.queue.put(item) 
                print('生产者生产了%s'%item)
                sleep(1) # 放慢速度,方便我们查看
    
    class Concumer(Thread):
        def __init__(self, queue):
            super().__init__()
            self.queue = queue
    
        def run(self):
            while True:
                item = self.queue.get()
                print('消费者消费了%s'%item)
                sleep(1)
    
    producer = Producer(queue)
    concumer = Concumer(queue)
    producer.start()
    concumer.start()
    producer.join()
    concumer.join()

    进程需要注意的事,队列导入的不是queue库里的,虽然也可以,但是不推荐,这里推荐用multiprocessing.Manage.Queue()

    from multiprocessing import Process, Manager
    from random import randint
    from time import sleep
    
    mgr = Manager()    # Manage开启的是守护进程,结尾必须.join添加阻塞
    queue = mgr.Queue(4)
    
    class Producer(Process):
        def __init__(self, queue):
            super().__init__()
            self.queue = queue
    
        def run(self):
            while True:
                item = randint(1, 99)    # 随机生成生产的量
                self.queue.put(item)
                print('生产者生产了%s'%item)
                sleep(1) # 放慢速度,方便我们查看
    
    class Concumer(Process):
        def __init__(self, queue):
            super().__init__()
            self.queue = queue
    
        def run(self):
            while True:
                item = self.queue.get()
                print('消费者消费了%s'%item)
                sleep(1)
    
    producer = Producer(queue)
    concumer = Concumer(queue)
    producer.start()
    concumer.start()
    producer.join()
    concumer.join()

    运行结果如图:代码会一直执行,除非手动停止

  • 相关阅读:
    shell脚本:/bin/sh^M: bad interpreter: No such file or directory。(转)
    Buffer在JDK中的基本说明

    清除版本控制信息针对 SVN
    修改——对密码进行加密
    省市加载javascript
    visual studio 2010 中 javascript 提示文本
    折腾自己的博客样式,自适应两列布局
    给动态加载的图片添加延迟加载(附在线demo)
    44种IE css bug实例测试总结(转载)
  • 原文地址:https://www.cnblogs.com/pywjh/p/9497743.html
Copyright © 2020-2023  润新知