首頁>技術>

在講解多執行緒時,介紹了 3 種實現執行緒間通訊的機制,同樣 Python 也提供了多種實現程序間通訊的機制,下面我們一起來看看吧。

程序間通訊

我們知道程序之間資料是相互隔離的,要想實現程序間的通訊(IPC機制),就必須藉助於一些技術才可以,比如multiprocessing模組中的:佇列和管道,這兩種方式都是可以實現程序間資料傳輸的,由於佇列是管道+鎖的方式實現,所以我們著重研究佇列即可

佇列

概念介紹

建立共享的程序佇列,Queue是多程序安全的佇列,可以使用Queue實現多程序之間的資料傳遞。

大白話總結一下就是佇列支援多個人從佇列的一端放入資料,同樣支援多個人從佇列的另一端取資料

基本用法

Queue([maxsize]) # 建立共享的程序佇列 佇列底層使用管道和鎖定實現。# 引數 :maxsize是佇列中允許的最大項數。如果省略此引數,則無大小限制。

程式碼實現

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()

8
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 不會面向物件,肯定學不好!簡易的Python面向物件攻略來啦