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