zoukankan      html  css  js  c++  java
  • (8)进程---Queue队列

     

    # IPC Inter-Process Communication

    # 实现进程之间通信的两种机制:

    # 管道 Pipe 用的很少

    # 队列 Queue

    队列的特征:现进先出,栈属于后进后出

    基本语法:from multiprocessing import Queue

    q = Queue(3) 传参数表示只允许放入3个数,不是长度,是个数

    q.get() 取不到的时候会有阻塞,不会报异常,程序挂起

    q.put() 存入超出范围也不会报异常

    q.getnowait() 拿不到报异常

    q.put_nowait() 非阻塞版本的put ,放入超出范围也会报异常

    q.empty() 检测是否为空 (了解) 在一边存一边取得时候判断不准确

    q.full() 检测是否已经存满 (了解) 在一边存一边取得时候判断不准确

    生产者和消费者模型:

    生产者和消费者模型从程序上来讲就是数据的存入和获取的过程

    最为理想的生产者和消费者模型 , 两者之间的运行速度应该是同步的

    from multiprocessing import Process,Queue
    import time
    import random
    # 消费者方法 [负责取值]
    def consumer(q,name):
        while True:
            food = q.get()
            if food is None:
                break
            time.sleep(random.uniform(0.5,1))
            print("%s吃了一个%s" % (name,food))
    
    # 生产者方法 [负责存值]
    def producer(q,name,food):
        for i in range(5):
            time.sleep(random.uniform(0.3,0.8))
            print("%s生产了%s" % (name,food))
            q.put(food+str(i))
    
    
    if __name__ == "__main__":
        q = Queue()
        c1 = Process(target=consumer,args=(q,"陈露中"))
        c2 = Process(target=consumer,args=(q,"陈根基"))
        # c1.daemon = True
        c1.start()
        c2.start()
        p1 = Process(target=producer,args=(q,"订海呀","地瓜"))
        p2 = Process(target=producer,args=(q,"陈红平","黄瓜"))
        p1.start()
        p2.start()
        
        p1.join()
        p2.join()
        q.put(None) # 添加None,让程序自动结束
        q.put(None)
    View Code

     执行结果:

    订海呀生产了地瓜
    陈红平生产了黄瓜
    订海呀生产了地瓜
    陈红平生产了黄瓜
    陈根基吃了一个黄瓜0
    订海呀生产了地瓜
    陈露中吃了一个地瓜0
    陈红平生产了黄瓜
    订海呀生产了地瓜
    陈根基吃了一个地瓜1
    陈露中吃了一个黄瓜1
    陈红平生产了黄瓜
    陈红平生产了黄瓜
    陈根基吃了一个地瓜2
    订海呀生产了地瓜
    陈露中吃了一个黄瓜2
    陈根基吃了一个地瓜3
    陈露中吃了一个黄瓜3
    陈根基吃了一个黄瓜4
    陈露中吃了一个地瓜4
    View Code

     

  • 相关阅读:
    IOC+AOP
    基础知识
    断点续传
    监听程序
    Action、View、ActionResult、ViewResult、ContentResult
    json的使用(JObect,JsonData,JArray)
    get/post 接口调用
    常见的加密和解密
    WebUtility(提供在处理 Web 请求时用于编码和解码 URL 的方法。)
    MyBatis动态SQL和缓存
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787256.html
Copyright © 2011-2022 走看看