多進程之間通信可以使用multiprocessing中的Queue()來完成,下面簡單介紹一下Queue()裏面的函數及功能
初始化Queue()對象時(例如:q=Queue()),若括號中沒有指定最大可接收的消息數量,或數量爲負值,那麼就代表可接受的消息數量沒有上限(直到內存的盡頭);
Queue.qsize():返回當前隊列包含的消息數量;
Queue.empty():如果隊列爲空,返回True,反之False ;
Queue.full():如果隊列滿了,返回True,反之False;
Queue.get([block[, timeout]]):獲取隊列中的一條消息,然後將其從列隊中移除,block默認值爲True;
1)如果block使用默認值,且沒有設置timeout(單位秒),消息列隊如果爲空,此時程序將被阻塞(停在讀取狀態),直到從消息列隊讀到消息爲止,如果設置了timeout,則會等待timeout秒,若還沒讀取到任何消息,則拋出"Queue.Empty"異常;
2)如果block值爲False,消息列隊如果爲空,則會立刻拋出"Queue.Empty"異常;
Queue.get_nowait():相當Queue.get(False);
Queue.put(item,[block[, timeout]]):將item消息寫入隊列,block默認值爲True;
1)如果block使用默認值,且沒有設置timeout(單位秒),消息列隊如果已經沒有空間可寫入,此時程序將被阻塞(停在寫入狀態),直到從消息列隊騰出空間爲止,如果設置了timeout,則會等待timeout秒,若還沒空間,則拋出"Queue.Full"異常;
2)如果block值爲False,消息列隊如果沒有空間可寫入,則會立刻拋出"Queue.Full"異常;
- Queue.put_nowait(item):相當Queue.put(item, False);
下面請看一個簡單的例子:
其中進程p_get執行函數get_data從隊列q中獲取數據,進程p_put執行函數put_data向隊列q寫入數據.
from multiprocessing import Queue, Process
import time
def get_data(q):
"""從隊列q裏面獲取數據"""
while True:
if q.qsize:
print('取出%s' % q.get())
time.sleep(0.6)
def put_data(q):
"""往隊列q裏面添加數據"""
count = 0
while True:
count += 1
if q.qsize() < 100:
q.put("第%s個數據" % count)
print("放入第%s個數據" % count)
time.sleep(0.5)
def main():
q = Queue()
p_get = Process(target=get_data, args=(q,))
p_get.start()
p_put = Process(target=put_data, args=(q,))
p_put.start()
p_put.join()
p_get.join()
if __name__ == '__main__':
main()