put_nowait与get_nowait
直接上结论:
put与get方法是两个阻塞方法:put不到值程序夯住,get不到程序也夯住。
put_nowait与get_nowait方法是两个非阻塞方法:put_nowait没有值的话不等,get_nowait取不到值也不等了,程序不会夯住,但是一定要做异常处理!
先看下面这段代码:
from multiprocessing import Queue # 只能放我5个 q = Queue(5) q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) print('******') q.put(6) print('######') print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get())
结果为:
******
这样的结果,是因为我们在创建Queue的对象是规定最多只能放5个,如果多放的话程序会夯在第六个位置。
但是如果我们就想放的话,可以在第六个位置用put_nowait方法。
# -*- coding:utf-8 -*- from multiprocessing import Queue # 只能放我5个 q = Queue(5) q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) print('******') q.put_nowait(6) print('######') print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get())
但是此时程序会报错:
这是一个“自定义异常”,我们需要导入queue模块来处理,所以。正确的pu_nowaitt程序是酱紫的:
# -*- coding:utf-8 -*- import queue from multiprocessing import Queue # 只能放我5个 q = Queue(5) q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) print('******') try: q.put_nowait(6) print('######') except queue.Full: print('队列溢出,做点别的处理') pass print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get())
结果为:
******
队列溢出,做点别的处理
1
2
3
4
5
可以看到:没有进行异常里面的内容~~没有打印‘’######‘可以看到。
但是!注意了!我明明用了6个get,但结果只有五个数!
因此:put_nowait方法会丢失数据!当然我们可以把丢失的数据放在别的文件或其他数据结构中,但是,这样不常用,因此实际情况下put_nowait不常用!
那我们非得想把第六个数据拿到怎么做呢?
就是在接收的时候用get_nowait方法!
# -*- coding:utf-8 -*- import queue from multiprocessing import Queue # 只能放我5个 q = Queue(5) q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) print('******') try: q.put_nowait(6) print('######') except queue.Full: print('队列溢出,做点别的处理') pass print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get_nowait())
但是仍然会报错:
加上异常处理就好了,所以正确的get_nowait方法是这样的:
# -*- coding:utf-8 -*- import queue from multiprocessing import Queue # 只能放我5个 q = Queue(5) q.put(1) q.put(2) q.put(3) q.put(4) q.put(5) print('******') try: # 满了的话我也不等 q.put_nowait(6) print('######') except queue.Full: print('队列溢出,做点别的处理') pass print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) try: # 空了的话数据我就不取了 print(q.get_nowait()) except queue.Empty: pass
结果为:
get_nowait十分常用!异步的程序,不能阻塞,如果程序进入阻塞队列的话下一次再想开始得从就绪队列中取了~