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十分常用!異步的程序,不能阻塞,如果程序進入阻塞隊列的話下一次再想開始得從就緒隊列中取了~  

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM