• 并发编程之生产者消费者模型


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

    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 一块蛋糕被吃掉了

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

  • 相关阅读:
    VS2010-MFC(常用控件:列表框控件ListBox)
    VS2010-MFC(常用控件:按钮控件的编程实例)
    VS2010-MFC(常用控件:按钮控件Button、Radio Button和Check Box)
    VS2010-MFC(常用控件:编辑框Edit Control)
    VS2010-MFC(常用控件:静态文本框)
    VS2010-MFC(对话框:颜色对话框)
    VS2010-MFC(对话框:字体对话框)
    VS2010-MFC(对话框:文件对话框)
    VS2010-MFC(对话框:消息对话框)
    [洛谷P2113] 看球泡妹子
  • 原文地址:https://www.cnblogs.com/NoteBook3013/p/10445440.html
Copyright © 2020-2023  润新知