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

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

    使用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()

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

  • 相关阅读:
    经典的SQL语句(摘抄)
    在C#里获取U盘的盘符
    sql2005分区表示例
    解决VS2008打了SP1补丁后智能提示变英文的问题!!
    IE的打印window.print
    [摘录]SQLServer2008/2005 生成数据字典SQL语句
    表单元素与提示文字无法对齐的问题(input,checkbox文字对齐)
    C# 使用正则表达式去掉字符串中的数字
    MDI中通过GetActiveView获得VIEW
    代码管理技巧——两步创建本地SVN服务器图文教程【转】
  • 原文地址:https://www.cnblogs.com/pywjh/p/9497743.html
Copyright © 2011-2022 走看看