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

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

  • 相关阅读:
    [AHOI2006]文本编辑器 Splay tree区间操作
    HDU-3487 Play with Chain Splay tee区间反转,移动
    HDU-4619 Warm up 2 二分匹配
    HDU-4618 Palindrome Sub-Array 暴力枚举
    HDU-4616 Game 树形DP
    HDU-4614 Vases and Flowers 线段树区间更新
    HDU-4612 Warm up 边双连通分量+缩点+最长链
    HDU-4611 Balls Rearrangement 循环节,模拟
    HDU-4605 Magic Ball Game 树状数组+离散+dfs
    HDU-3436 Queue-jumpers 树状数组 | Splay tree删除,移动
  • 原文地址:https://www.cnblogs.com/pywjh/p/9497743.html
Copyright © 2011-2022 走看看