多线程多队列(python)

import threading
import time
import queue

_sentinal = object()   ### 队列中的线程终止信号

class Baozi:
    def __init__(self, name):
        self.name = name

    def produce(self, q1):
    # 这个函数专门产生包子
        for i in range(20):
            q1.put('第{}个包子'.format(str(i)))
            # 生产出包子,表明包子的id号
            time.sleep(1)
            # 要一秒才能造出一个包子
        q1.put(_sentinal)

    def package(self, q1, q2):
    
        while True:
            # 只要包子店里有包子
            print('包子店的包子剩余量:'+str(q1.qsize()))
            # q.qsize()是获取队列中剩余的数量
            temp = q1.get()
            if temp is _sentinal:
                q2.put(_sentinal)
                break

            print('打包:'+ temp)
    
            print('包子店的包子剩余量:'+str(q1.qsize()))

            # q.get()是一个堵塞的,会等待直到获取到数据
            print('------------')

            q2.put(temp)
            print('q2剩余量:'+str(q2.qsize()))
            # q1.task_done()
            time.sleep(3)
       
    def consume(self, q2):
        while True:
            # 只要包子店里有包子
            print('打包的包子剩余量:'+str(q2.qsize()))
            # q.qsize()是获取队列中剩余的数量
            temp = q2.get()
            if temp is _sentinal:
                q2.put(_sentinal)
                break
            print(f'{
      
      self.name}吃了:'+ temp)
            # q.get()是一个堵塞的,会等待直到获取到数据
            print('------------')
            # q2.task_done()
            time.sleep(3)


if __name__ == "__main__":
    
    '''
    模拟包子店卖包子
    厨房每一秒钟制造一个包子
    顾客每三秒吃掉一个包子
    厨房一次性最多存放100个包子
    '''
    q1 = queue.Queue(maxsize=100)
    # 厨房一次性最多存放100个包子
    q2 = queue.Queue(maxsize=20)

    bz = Baozi("小明")
    t1 = threading.Thread(target=bz.produce,args=(q1,))
    t1.start()

    t2 = threading.Thread(target=bz.package,args=(q1, q2))
    t2.start()  

    t3 = threading.Thread(target=bz.consume,args=(q2,))
    t3.start()
    t3.join()

    print("######################")
    print("包子卖完了")
    print("######################")

猜你喜欢

转载自blog.csdn.net/weixin_42990464/article/details/125853591
今日推荐