進程之間使用隊列Queue()通信

多進程之間通信可以使用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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章