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("主程序执行结束。。。")
  • 相关阅读:
    es6中promise的实现及原理
    移动端
    javascript知识点复习
    html和css基本常识总结
    kafka,查看指定group下topic的堆积数量
    解决问题:Android设备运行自动化脚本报错 ioerror RPC server not started
    linux下安装python3
    使用vsftpd搭建FTP服务
    前端性能监控平台showslow+Yslow搭建
    学习笔记-- Python网络编程
  • 原文地址:https://www.cnblogs.com/youhongliang/p/11862957.html
Copyright © 2011-2022 走看看