python入門教程12-08 (python語法入門之進程間通訊)

在講解多線程時,介紹了 3 種實現線程間通訊的機制,一樣 Python 也提供了多種實現進程間通訊的機制,下面咱們一塊兒來看看吧。安全

進程間通訊多線程

咱們知道進程之間數據是相互隔離的,要想實現進程間的通訊(IPC機制),就必須藉助於一些技術才能夠,好比multiprocessing模塊中的:隊列和管道,這兩種方式都是能夠實現進程間數據傳輸的,因爲隊列是管道+鎖的方式實現,因此咱們着重研究隊列便可ide

隊列函數

概念介紹線程

建立共享的進程隊列,Queue是多進程安全的隊列,可使用Queue實現多進程之間的數據傳遞。code

大白話總結一下就是隊列支持多我的從隊列的一端放入數據,一樣支持多我的從隊列的另外一端取數據對象

基本用法隊列

Queue([maxsize]) # 建立共享的進程隊列 隊列底層使用管道和鎖定實現。# 參數 :maxsize是隊列中容許的最大項數。若是省略此參數,則無大小限制。進程

代碼實現ip

from multiprocessing import Queue

q=Queue(3) # 建立一個最大隻能容納3個數據的隊列"""

經常使用方法

put ,get ,put_nowait,get_nowait,full,empty

"""q.put(3) # 往隊列中存放數據q.put(3)

q.put(3)

q.put(3) # 若是隊列已經滿了,程序就會停在這裏,等待數據被別人取走,再將數據放入隊列。若是隊列中的數據一直不被取走,程序就會永遠停在這裏。try:

q.put_nowait(3) # 可使用put_nowait,若是隊列滿了不會阻塞,可是會由於隊列滿了而報錯。except:  # 所以咱們能夠用一個try語句來處理這個錯誤。這樣程序不會一直阻塞下去,可是會丟掉這個消息。    print('隊列已經滿了')

# 所以,咱們再放入數據以前,能夠先看一下隊列的狀態,若是已經滿了,就不繼續put了。print(q.full())  # 判斷隊列中數據是否已存放滿了print(q.get())  # 從隊列中獲取數據print(q.get())

print(q.get())

print(q.get()) # 同put方法同樣,若是隊列已經空了,那麼繼續取就會出現阻塞。try:

q.get_nowait(3) # 可使用get_nowait,若是隊列滿了不會阻塞,可是會由於沒取到值而報錯。except: # 所以咱們能夠用一個try語句來處理這個錯誤。這樣程序不會一直阻塞下去。    print('隊列已經空了')

print(q.empty()) # 判斷隊列中數據是否已經被所有取出

基於隊列實現進程間通訊

import timefrom multiprocessing import Process, Queuedeff(q): q.put('hello') #調用主函數中p進程傳遞過來的進程參數 put函數爲向隊列中添加一條數據。if name == 'main':

q = Queue()  # 建立一個Queue對象    p = Process(target=f, args=(q,)) #建立一個進程    p.start()

print(q.get())  # 從隊列中獲取數據    p.join()from multiprocessing import Queue,Processdefproducer(q):    q.put('hello big baby!')defconsumer(q):    print(q.get())if __name__ == '__main__':

q = Queue()

p = Process(target=producer,args=(q,))

p.start()

p1 = Process(target=consumer,args=(q,))

p1.start()
相關文章
相關標籤/搜索