zoukankan      html  css  js  c++  java
  • Python的学习之旅———生产者消费者模型

    生产者消费者模型

     1 from multiprocessing import Process,Queue,JoinableQueue
     2 import time
     3 import random
     4 
     5 def producer(name,food,q):
     6     for i in range(3):
     7         res='%s%s' %(food,i)
     8         time.sleep(random.randint(1,3))
     9         q.put(res)
    10         print('%s 生产了 %s' %(name,res))
    11 
    12 def consumer(name,q):
    13     while True:
    14         res=q.get()
    15         if res is None:break
    16         time.sleep(random.randint(1, 3))
    17         print('%s 吃了 %s' %(name,res))
    18         q.task_done()
    19 
    20 if __name__ == '__main__':
    21     q=JoinableQueue() #q.join()
    22     p1=Process(target=producer,args=('egon','泔水',q))
    23     p2=Process(target=producer,args=('贱哥','',q))
    24     c1=Process(target=consumer,args=('alex',q))
    25     c2=Process(target=consumer,args=('alex',q))
    26     c3=Process(target=consumer,args=('alex',q))
    27     c1.daemon=True
    28     c2.daemon=True
    29     c3.daemon=True
    30 
    31     p1.start()
    32     p2.start()
    33     c1.start()
    34     c2.start()
    35     c3.start()
    36     
    37     p1.join()
    38     p2.join()
    39     q.join()
    40     print('')
    生产者 消费者

    关键点:

    q.task_done()           消费者发通知,一个数据已经被处理完了 ,队列里有一个计数 生产了了多少个就计数多少个 比如10,taskdone 就-1.

    q=JoinableQueue() #q.join()      可等待队列 join的是队列,队列里被取干净就是队列结束

    先要等 生产者都生产完了

    也就是 p1.join() 和p2.join() 都执行完了

    再写q.join()   q.join() 执行完是收集到了足够的 q.task_done() 

    这时候消费者 还或者,但是已经不可能在收到 队列里的的数值,所以把消费者设置成守护进程。     

  • 相关阅读:
    20130118
    延迟加载、分页显示等功能的增加
    ==和Equals的区别
    20160115--Hibernate
    20160108--搜索查询
    20150105
    20151229--数据表格
    20151226--easyUI
    DreamWeaver使用技巧(转)
    20121109
  • 原文地址:https://www.cnblogs.com/surehunter/p/7890408.html
Copyright © 2011-2022 走看看