zoukankan      html  css  js  c++  java
  • python线程------queue、生产者和消费者模式

    一、queue简介

    1、queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递

    2、FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉

    二、queue的一些方法

    1、 take done()

    意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。
    如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

    2、 join()

    阻塞调用线程,直到队列中的所有任务被处理掉。
    只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

    3、put()

    将数据放入队列中

    4、 get()

    取出队列的数据

    import threading,queue
    import time,random
    
    q = queue.Queue()#创建一个队列
    
    def Producer(name):
        count =0
        while count < 10:
            print('making.........')
            time.sleep(random.randrange(3))
            q.put(count)
            print('Product %s has produced %s baozi...' % (name,count))
            count += 1
            q.task_done()
            print('ok.......')
            
    def Consumer(name):
        count = 0
        while count < 10:
            time.sleep(random.randrange(4))
            print("..............waiting..............")
            q.join()
            data = q.get()          
            print(data)
            print('Comsumer %s has eat %s baozi...' % (name,data))        
            count += 1             
           
    p1 = threading.Thread(target = Producer,args = ('厨师',))
    c1 = threading.Thread(target = Consumer,args = ('食客1',)) 
    c2 = threading.Thread(target = Consumer,args = ('食客2',))                
    
    p1.start()
    c1.start()
    c2.start()            
                       
    

    三、生产者和消费者的一些总结

    #程序中有两类角色
            一类负责生产数据(生产者)
            一类负责处理数据(消费者)
            
    #引入生产者消费者模型为了解决的问题是:
            平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度
            
    #如何实现:
            生产者<-->队列<——>消费者
        #生产者消费者模型实现类程序的解耦和
    
    
  • 相关阅读:
    从当前url替换获得新的url
    访问者模式
    备忘录模式
    make makefile cmake qmake 区别
    qt编译过程
    tensorflow前处理
    tesorflow操作
    tensorflow的object_detection安装
    tensorflow 编译与训练
    tensorflow后处理
  • 原文地址:https://www.cnblogs.com/hyxk/p/11289068.html
Copyright © 2011-2022 走看看