zoukankan      html  css  js  c++  java
  • 进程对列,生产者和消费者,JoinableQueue

    1.进程对列 

      让进程之间共享资源

      先进先出

    (1)基本语法

    from multiprocessing import Process,Queue
    q = Queue()
    # 1.用put方法往队列中存值
    q.put(111)
    # 2.用get方法从队列中取值
    res= q.get()
    print(res)
    # 3.当队列中没有值,再调用get就会发生阻塞
    res = q.get()
    print(res)
    # 4.get_nowait 在没有值的时候,直接报错。错在兼容性问题,不推荐使用
    res = q.get_nowait()
    print(res)
    
    # (2) 指定队列长度 可以适用queue
    q1 = Queue(3)
    q1.put(11)
    q1.put(22)
    q1.put(33)
    # 注意:如果超出队列长度,直接阻塞
    # q1.put(44)
    # 注意:如果超出了队列长度,直接报错(不推荐)
    # q1.put_nowait(44)

    (2)多进程之间共享数据

    from multiprocessing import Process,Queue
    def func(q):
        # 2.在子进程中获取数据
        res = q.get()
        print(res)
        # 3.子进程添加数据
        q.put("bbb")
    
    if __name__ == '__main__':
        q2 = Queue()
        p1 = Process(target=func,args=(q2,))
        p1.start()
    
        # 1.在主进程中,添加数据
        q2.put("aaa")
    
        # 为了能够拿到子进程中添加的队列元素,需要等待子进程执行结束后获取
        p1.join()
    
        # 4.主进程获取子进程添加的数据
        res = q2.get()
        print("主进程执行结束:值%s" % (res))

    2.生产者和消费者模型

    # 爬虫例子:
      1号进程负责抓取网页当中的内容
      2号进程负责匹配网页当中的关键字

      1号进程可以理解为生产者
      2号进程可以理解为消费者
    理想的生产者和消费者模型:彼此运行的速度相当;

    从程序上来讲:
      生产者就是负责存储数据(put)
      消费者就是负责获取数据(get)

    (1)基本语法

    from multiprocessing import Process,Queue
    import time,random
    def consumer(q,name):
        while True:
            food = q.get()
            time.sleep(random.uniform(0.1,1))
            print("%s 吃了一个%s"% (name,food))
    
    # 生产者模型
    def producer(q,name,food):
        for i in range(5):
            time.sleep(random.uniform(0.1,1))
            print("%s 生产了 %s%s"%(name,food,i))
            q.put(food+str(i))
    
    if __name__ == '__main__':
        q=Queue()
        # 创建生产者
        p1 = Process(target=producer,args=(q,"周永林","大便"))
        p1.start()
    
        # 创建消费者
        c1 = Process(target=consumer,args=(q,"张龙"))
        c1.start()
    
        p1.join()
    
        print("主程序执行结束。。。")

    3.JoinableQueue

    put 寻访
    get 获取
    task_done 队列数据减一
    join 阻塞

    task_done 与 join 通过一个中间变量统计队列中元素个数
    每放入一个值,成员中的中间变量值加1
    每执行一次task_done,成员中的中间变量值减1
    join 会根据中间变量值来确定是阻塞还是放行
    如果中间变量是0 意味着放行
    如果中间变量不是0 意味着阻塞

    (1)基本用法

    from multiprocessing import Process,JoinableQueue
    jq = JoinableQueue()
    jq.put("abab")
    print(jq.get())
    jq.task_done()
    # jq.join()
    print("finish")

    (2)生产者和消费者模型

    from multiprocessing import Process,JoinableQueue
    # 消费着模型
    def consumer(q,name):
        while True:
            food = q.get()
            time.sleep(random.uniform(0.1,1))
            print("%s吃了一个%s"%(name,food))
            q.task_done()
    #生产着模型
    def producer(q,name,food):
        for i in range(5):
            time.sleep(random.uniform(0.1,1))
            print("%s生产了 %s%s"%(name,food,i))
            q.put(food+str(i))
    
    
    if __name__ == '__main__':
        # 创建队列
        jq = JoinableQueue()
        #消费着进程
        c1 = Process(target=consumer,args=(jq,"张晓东"))
        c1.daemon = True
        c1.start()
    
        #生产者进程
        p1 = Process(target=producer,args=(jq,"黄乐熙","大茄子"))
        p1.start()
    
        #等待生产者把所有数据放到队列中;
        p1.join()
        # 直到所有数据被消费完毕之后,放行。
        jq.join()
    
        print("主程序执行结束。。。")
  • 相关阅读:
    缓冲区溢出实验 6 exit(0)
    缓冲区溢出实验 1 strcpy
    缓冲区溢出实验 5 Snprintf
    [LeetCode] 130. Surrounded Regions 包围区域
    [LeetCode] 547. Friend Circles 朋友圈
    [LeetCode] 200. Number of Islands 岛屿的数量
    [LeetCode 695] Max Area of Island 岛的最大面积
    [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子串
    [LeetCode] 5. Longest Palindromic Substring 最长回文子串
    [LeetCode] 53. Maximum Subarray 最大子数组 --动态规划+分治
  • 原文地址:https://www.cnblogs.com/youhongliang/p/11862957.html
Copyright © 2011-2022 走看看