zoukankan      html  css  js  c++  java
  • 并发编程之生产者消费者模型

    在程序执行中,例如:爬虫..

    1 从网络上爬取数据,这个阶段,由于网络原因,一般速度是比较慢的

    2 在这些数据中筛选我想要的东西,CPU运行速度很快,这个过程就是比较快的

    那么这样子运行下来就会造成,我十分钟爬取到的数据,我花一分钟就处理完了..这就造成了,CPU要长时间在等待数据的到来..

    在我们实际生活中:

    1 厂家生产出来的东西,一直没有人买,(供大于求)商品可能会涨价

    2 厂家生产出来的东西.不够消费者使用的(供不应求).商品就可能降价

    为了达到相对的平衡,让社会更好的发展..于是,就产生了生产者,消费者模型..

    通过对速度快的一方进行减少(10*(5-3)=20),对速度慢的一方

     1 import time
     2 from multiprocessing import Process, Queue
     3 
     4 
     5 def cook(plate):
     6     """
     7     厨师(生产者)
     8     """
     9     while 1:
    10         time.sleep(0.1)  # 厨师每0.1秒做出一个蛋糕
    11         plate.put("蛋糕")
    12         print("厨师做出了一块蛋糕...")
    13 
    14 def eat(plate):
    15     """
    16     食客(消费者)
    17     """
    18     while 1:
    19         time.sleep(0.01)        # 每个食客每0.01秒就把蛋糕吃完了
    20         plate.get()
    21         print("一块蛋糕被吃掉了")
    22 
    23 
    24 
    25 if __name__ == '__main__':
    26     plate = Queue()
    27     for i in range(3):
    28         # 生出3个厨师和3个食客
    29         cooker = Process(target=cook, args=(plate, ))
    30         cooker.start()
    31     for j in range(3):
    32         eater = Process(target=eat, args=(plate, ))
    33         eater.start()

    这样子代码执行..基本是厨师生产蛋糕就被吃掉,(供不应求)

    结果对照:

     1 厨师做出了一块蛋糕...
     2 一块蛋糕被吃掉了
     3 厨师做出了一块蛋糕...
     4 一块蛋糕被吃掉了
     5 厨师做出了一块蛋糕...
     6 一块蛋糕被吃掉了
     7 厨师做出了一块蛋糕...
     8 一块蛋糕被吃掉了
     9 厨师做出了一块蛋糕...
    10 一块蛋糕被吃掉了
     1 def cook(plate):
     2     """
     3     厨师(生产者)
     4     """
     5     while 1:
     6         time.sleep(0.1)  # 厨师每0.1秒做出一个蛋糕
     7         plate.put("蛋糕")
     8         print("厨师做出了一块蛋糕...")
     9 
    10 def eat(plate):
    11     """
    12     食客(消费者)
    13     """
    14     while 1:
    15         time.sleep(0.01)        # 每个食客每0.01秒就把蛋糕吃完了
    16         plate.get()
    17         print("一块蛋糕被吃掉了")
    18 
    19 
    20 
    21 if __name__ == '__main__':
    22     plate = Queue()
    23     for i in range(10):
    24         # 生出10个厨师
    25         cooker = Process(target=cook, args=(plate, ))
    26         cooker.start()
    27     for j in range(3):
    28         # 生成3个食客
    29         eater = Process(target=eat, args=(plate, ))
    30         eater.start()

    结果对照:

     1 厨师做出了一块蛋糕...
     2 一块蛋糕被吃掉了
     3 厨师做出了一块蛋糕...
     4 厨师做出了一块蛋糕...
     5 厨师做出了一块蛋糕...
     6 一块蛋糕被吃掉了
     7 一块蛋糕被吃掉了
     8 一块蛋糕被吃掉了
     9 厨师做出了一块蛋糕...
    10 一块蛋糕被吃掉了
    11 厨师做出了一块蛋糕...
    12 一块蛋糕被吃掉了

    这样子产出和消费基本持平,,就达到了最终的目的...

  • 相关阅读:
    [原]百度公交离线数据格式分析——4.小结
    [原]百度公交离线数据格式分析——3.加载城市列表
    [原]百度公交离线数据格式分析——2.从界面点击下载的流程
    [原]百度公交离线数据格式分析——1.准备工作
    网页版迅雷离线下载过程分析
    OPKG命令执行过程分析
    Python 随笔两则
    心理学在前端的应用--《设计师要懂心理学》读书笔记之人如何记忆和思考
    心理学在前端的应用---(设计师要懂心理学)读书笔记之人如何观察和阅读
    React阻止事件冒泡的正确打开方式
  • 原文地址:https://www.cnblogs.com/NoteBook3013/p/10445440.html
Copyright © 2011-2022 走看看