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十分常用!异步的程序,不能阻塞,如果程序进入阻塞队列的话下一次再想开始得从就绪队列中取了~  

 

    

 

posted on 2019-04-17 15:33  江湖乄夜雨  阅读(6945)  评论(0编辑  收藏  举报