一、Queue的基本使用
1啃洋、導入模塊
import multiprocessing
2传货、定義消息隊列,并指定長度
如果不指定隊列?度宏娄,則默認為最?
如果指定了消息隊列的??问裕,則消息隊列就有上限控制
queue = multiprocessing.Queue(3)
3、 向消息隊列中放?內容,可以是任何類型的數(shù)據(jù)
queue.put(1) # 放?第?個值
queue.put("hello") # 放?第?個值
queue.put([1, 2, 3]) # 放?第三個值
4孵坚、 從消息隊列中取出數(shù)據(jù)
print(queue) # 打印隊列對象
value1 = queue.get() # 獲取第?個值
print(value1)
value2 = queue.get() # 獲取第?個值
print(value2)
value3 = queue.get() # 獲取第三個值
print(value3)
二粮宛、Queue的常用方法
Queue.qsize():返回當前隊列包含的消息數(shù)量;
Queue.empty():如果隊列為空卖宠,返回True巍杈,反之False ;如果獲取是否為空的進程和放置值的進程同時執(zhí)?扛伍,值未放進去筷畦,empty() 已經(jīng)開始取,使用該方法得到的結果可能是True刺洒。避免這種情況發(fā)生鳖宾,可使用::time.sleep(0.0001) 稍微休眠下。
Queue.full():如果隊列滿了逆航,返回True,反之False鼎文;
Queue.get([block[, timeout]]):獲取隊列中的?條消息,然后將其從列隊中移除因俐,block默認值為
True拇惋;
如果block使?默認值,且沒有設置timeout(單位秒)女揭,消息列隊如果為空蚤假,此時程序將被阻
塞(停在讀取狀態(tài))栏饮,直到從消息列隊讀到消息為?吧兔,如果設置了timeout,則會等待timeout
秒袍嬉,若還沒讀取到任何消息境蔼,則拋出"Queue.Empty"異常灶平;
如果block值為False,消息列隊如果為空箍土,則會?刻拋出"Queue.Empty"異常逢享;
Queue.get_nowait():相當Queue.get(False);
Queue.put(item,[block[, timeout]]):將item消息寫?隊列吴藻,block默認值為True瞒爬;
如果block使?默認值,且沒有設置timeout(單位秒)沟堡,消息列隊如果已經(jīng)沒有空間可寫?侧但,
此時程序將被阻塞(停在寫?狀態(tài)),直到從消息列隊騰出空間為?航罗,如果設置了timeout禀横,
則會等待timeout秒,若還沒空間粥血,則拋出"Queue.Full"異常柏锄;
如果block值為False,消息列隊如果沒有空間可寫?复亏,則會?刻拋出"Queue.Full"異常趾娃;
Queue.put_nowait(item):相當Queue.put(item, False);
三缔御、Queue實現(xiàn)進程間通信
以Queue為例茫舶,在?進程中創(chuàng)建兩個?進程,?個往Queue?寫數(shù)據(jù)刹淌,?個從Queue?讀數(shù)據(jù)饶氏。具體實現(xiàn)如下:
'''
1、創(chuàng)建隊列有勾,寫入數(shù)據(jù)
2疹启、從隊列中讀取數(shù)據(jù)
3、使用進程通信
'''
import time
import multiprocessing
def queue_write(queue):
for i in range(10):
if queue.full():
print("隊列已滿~~~")
break
queue.put(i)
print(i)
time.sleep(0.5)
def queue_read(queue):
while True:
if queue.empty():
print("隊列已空~~~")
break
result = queue.get()
print(result)
if __name__ == '__main__':
queue = multiprocessing.Queue(5)
process_write = multiprocessing.Process(target=queue_write,args=(queue,))
process_write.start()
process_write.join()
process_read = multiprocessing.Process(target=queue_read,args=(queue,))
process_read.start()
輸出結果:
0
1
2
3
4
隊列已滿~~~
0
1
2
3
4
隊列已空~~~