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对于已经运行完的进程是可以看做无效的