zoukankan      html  css  js  c++  java
  • python-day9 队列

    和开源软件MQ 很相似 

    先进先出的逻辑,一个,N个噻, 1个,N个听Q

    from multiprocessing import Process,Queue
    #队列,先进先出
    q=Queue(3)

    q.put({'a':1})
    q.put('b')
    q.put('c')
    print(q.full()) -->是否 噻满
    q.put('d',False) #等同于q.put_nowait('d') 塞满后 再 噻,不 等待,直接报错
    q.put('d',timeout=2) #塞满后 再噻 等待2秒, 不能噻就报错
    print(q.qsize()) #查看q中 值的个数

    print(q.get())
    print(q.get())
    print(q.get())
    print(q.empty()) -->是否取空
    print(q.get(block=False)) #等同于q.get_nowait('d') 听满后 再听,不 等待,直接报错
    print(q.get_nowait())
    print(q.get(timeout=2)) #听满后 再听 等待2秒, 不能听就报错

    ==========================模拟真实案例======================

    吃包子, 厨师做,客户吃,相互 不干扰
    def GET(q,name,li):
    print('客户', name)
    for line in li:
    time.sleep(1)
    print('客户吃了',q.get())

    def PUT(q,name,li):
    print('厨师',name)
    for line in li:
    time.sleep(1)
    print('%s生产出%s' %(name,line))
    q.put(line)

    if __name__ == '__main__':
    q=Queue()
    li = ['包子%s' % i for i in range(10)]
    p=Process(target=PUT,args=(q,'la',li))
    p.start()

    p1=Process(target=GET,args=(q,'onda',li))
    p1.start()

    但是问题是,客户吃完后 不释放进程,还在卡住

    ===============================通过 put 提交一个  固定的值,让 get去 判断======================

    def GET(q,name):
    while True:
    time.sleep(2)
    res=q.get()
    if res is None :break
    print('客户%s, 吃了%s' %(name,res))

    def PUT(q,name,li):
    for line in li:
    time.sleep(1)
    q.put(line)
    print('厨师 %s 只做了%s' %(name,line))
    q.put(None)

    if __name__ == '__main__':
    q=Queue()
    p1=Process(target=GET,args=(q,'la'))
    p1.start()
    li=['包子%s' %i for i in range(10)]
    p2=Process(target=PUT,args=(q,'onda',li))
    p2.start()
    p1.join()
    p2.join()
    print('主进程')

    ==============================或者使用 JoinableQueue===========

    from multiprocessing import Process,JoinableQueue
    import time
    import random

    def consumer(q,name):
    while True:
    # time.sleep(random.randint(1,3))
    res=q.get()
    q.task_done()
    print('33[41m消费者%s拿到了%s33[0m' %(name,res))

    def producer(seq,q,name):
    for item in seq:
    # time.sleep(random.randint(1,3))
    q.put(item)
    print('33[42m生产者%s生产了%s33[0m' %(name,item))
    q.join()
    print('============>>')

    if __name__ == '__main__':
    q=JoinableQueue()
    c=Process(target=consumer,args=(q,'egon'),)
    c.daemon=True #设置守护进程,主进程结束c就结束
    c.start()

    seq=['包子%s' %i for i in range(10)]
    p=Process(target=producer,args=(seq,q,'厨师1'))
    p.start()

    # master--->producer----->q--->consumer(10次task_done)
    p.join() #主进程等待p结束,p等待c把数据都取完,c一旦取完数据,p.join就是不再阻塞,进
    # 而主进程结束,主进程结束会回收守护进程c,而且c此时也没有存在的必要了
    print('主进程')

    get()中

    q.task_done() 每吃完一个,都会 汇报一下,直到吃完,

    put()中

    q.join(),等待 get()吃完,  put就可以 获取到,然后向下 进行,
    而此时 put() 还卡在 听q

    get() 

    所以给 get()设置 守护进程,  在主进程释放后,将 get释放

    主进程:

    在让主进程通过  p.join()  等待 put()请求 结束 ,而put() 请求 会等get() 吃完, 最终 主进程才结束,然后 释放 get()

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/onda/p/7083176.html
Copyright © 2011-2022 走看看