程序之間資料是相互隔離的,要想實現程序間的通訊(ipc機制),就必須借助於一些技術才可以,比如multiprocessing模組中的:佇列和管道,這兩種方式都是可以實現程序間資料傳輸的,由於佇列是管道+鎖的方式實現,所以著重研究佇列即可
建立共享的程序佇列,queue是多程序安全的佇列,可以使用queue實現多程序之間的資料傳遞。
大白話總結一下就是佇列支援多個人從佇列的一端放入資料,同樣支援多個人從佇列的另一端取資料
queue([maxsize]) # 建立共享的程序佇列 佇列底層使用管道和鎖定實現。
# 引數 :maxsize是佇列中允許的最大項數。如果省略此引數,則無大小限制。
frommultiprocessing 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()) # 判斷佇列中資料是否已經被全部取出
importtime
from multiprocessing import
process, queue
deff(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,process
defproducer(q):
q.put(
'hello big baby!')
defconsumer(q):
(q.get())
if__name__ == '
__main__':
q =queue()
p = process(target=producer,args=(q,))
p.start()
p1 = process(target=consumer,args=(q,))
p1.start()
程序間通訊實現方法
程序間通訊實現方法 程序通常被定義為乙個正在執行的程式的例項,它由兩個部分組成 乙個是作業系統用來管理程序的核心物件。核心物件也是系統用來存放關於程序的統計資訊的地方 另乙個是位址空間,它包含所有的可執行模組或dll模組的 和資料。它還包含動態分配的空間。如執行緒堆疊和堆分配空間。每個程序被賦予它自...
python程序間通訊 例項
python實現程序間通訊簡單例項 例項講解了python實現兩個程式之間通訊的方法,具體方法 該例項採用socket實現,與socket網路程式設計不一樣的是socket.socket socket.af unix,socket.sock stream 的第乙個引數是socket.af unix ...
Linux訊息佇列實現程序間通訊例項詳解
linux訊息佇列實現程序間通www.cppcns.com信例項詳解 一 什麼是訊息佇列 訊息佇列提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。每個資料塊都被認為含有乙個型別,接收程序可以獨立地接收含有不同型別的資料結構。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。但是訊息佇列與命名...