Queue用法

 

Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。put方法用以插入数据到队列中,put方法还有两个可选参 数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到 该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full 异常。
get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为 True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为 False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常。Queue的一 段示例代码:

 

#-*- encoding:utf-8 -*-
import sys
import time
reload(sys)
sys.setdefaultencoding('utf-8')
import multiprocessing

def writer_proc(q):
    print"start write_proc"
    time.sleep(3)
    try:
        q.put(1, block = False)
        print"writer_proc\n"
    except:
        pass
    print"finish write_proc"

def reader_proc(q):
    print"start reader_proc"
    time.sleep(2)
    # time.sleep(3)#如果这句话代替上面那句话,那么整个代码运行顺序其实是不定的
    try:
        print (q.get(block = False))#从队列读取一个元素并且删除一个元素
        print"read_proc\n"
    except:
        pass
    print"finish reader_proc"

if __name__ == "__main__":#队列的作用是一个入口输入数据,出口读取数据
    q = multiprocessing.Queue()
    writer = multiprocessing.Process(target=writer_proc, args=(q,))#开一个进程
    writer.start()

    reader = multiprocessing.Process(target=reader_proc, args=(q,))#开一个进程
    reader.start()

    print"#############################"
    writer.join()
    print"------------writer.join()------------"
    reader.join()
    print"------------reader.join()-------------------"

 

如果这是在分析别人的代码,那么要分四种情况:
reader跑完和没跑完,writer跑完和没跑完,然后排列组合共四种
然后才能分析清楚join是否有了阻塞的效果。


join就是去“回收”线程,如果没跑完,当然要等跑完了,如果已经跑完了,立刻就“回收”了
join是阻塞的(如果没跑完,要等),至于是否代码真的有花时间等,那个要看你进程具体做的什么,等等
queue自身可以检查 empty() (是否为空),也可以直接做get然后自己去收一下empty的错误,也可以用task_done()作为信号传递
join是说“等待”如果你的子进程已经结束了,就不用等待了
join这里,只是说等待的顺序(假设两个进程都没有跑完,需要时间跑)
那么先等待哪个结束


总结:
在两个进程都没运行完的情况下,join是确保哪个进程先结束,另外一个进程先阻塞
对于进程运行完的,有join=没有join
join对于已经运行完的进程是可以看做无效的

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值