关于队列的阻塞问题/day18

from multiprocessing import Queue

q=Queue(3)
q.put(1)
q.put(2)
q.put(3)
# q.get()  #加上这句话就不会阻塞,
# q.put(4)   #由于默认为阻塞状态,程序将会阻塞在这里

#参数block:默认为真,表示队列已满,程序阻塞,表示是否阻塞
#如果为False表示不需要阻塞,如果队列已满,将会抛出异常
#参数timeout():表示阻塞时间单位为秒
try:
    # q.put(4,block=False)
    q.put(4,block=True,timeout=1)
except:
    print("现有消息队列已满,现有队列长度为%s"%(q.qsize()   ))
print("~~~~~~~~``")




#put的另一种方式
#q.put_nowait(5),等价于q.put(5,block=False)
try:
    q.put_nowait(5)
except:
    print("现有消息队列已满,现有队列长度为%s"%(q.qsize()))


#推荐方式,先判断消息队列是否满了,再往里放
if not q.full():
    print("6")

#取
#格式
q.get()
q.get()
q.get()
print("现有队列长度为%s" % (q.qsize()))
# q.get()
# q.get(block=False)
# q.get(block=True,timeout=2)
#在读取时判断是否为空
if not q.empty():
    q.get()

#另一种写法
q.get_nowait()  #等价于q.get(block=False)
print("~~~~~~~")

队列阻塞的案例

#需求,在父进程中创建两个子进程,一个往Queue里写数据,一个读取数据
from multiprocessing import Queue
from multiprocessing import Process
import random,time
def write(q):
    #队列中的Exit看成结束标志,不是数据,当value为Exit时,在read()中跳出循环
    for value in ["A","B","C","D","Exit"]:
        q.put(value)                  #把value值加入队列中
        print("Put %s"%(value))
        time.sleep(random.randint(0,2))
def read(q):
    while True:              #不断的在这里等待取数据
        if not q.empty():    #如果队列不为空就执行
            value=q.get()
            if value=="Exit": #得到标志就退出
                break
            else:
                print("Get %s from queue" % (value))
                time.sleep(random.randint(0, 2))

if __name__ == '__main__':
    #创建一个队列
    q=Queue()
    #创建进程
    pw=Process(target=write,args=(q,))
    pr=Process(target=read,args=(q,))
    #启动进程
    pw.start()    #写入
    pw.join()     #此时pw结束,阻塞在这里等到pw执行完成之后在往下执行

    pr.start()    #读出开启
    pr.join()

    print("程序pw进程结束")

猜你喜欢

转载自blog.csdn.net/qq_39112101/article/details/88530722