佇列:先進先出,後進後出
棧:先進後出,後進先出
之前的文章介紹過使用socket,檔案都可以實現程序間通訊,socket是通過網路通訊,兩個程序間可以不在同乙個電腦上;而檔案是存放在硬碟裡,乙個程序寫檔案,乙個程序讀檔案,實現程序間通訊。不管是socket還是檔案最終都是把資料存放在記憶體裡,那麼我們可以直接用記憶體來實現程序間通訊,這裡可以用到佇列(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);
例1.
from multiprocessing import queue
q=queue(3)
ifnot q.full():
q.put(23)
q.put(
"kglfdg"
) q.put(
"ui")if
not q.empty():
a=q.get(
) b=q.get(
) c=q.get(
)print
(a)print
(b)print
(c)
執行結果:
d:\anaconda3\python.exe e:
/code/a.py
23kglfdg
ui程序已結束,退出** 0
例2(高階).
import multiprocessing
defdownload_from_web
(q):
data=[11
,22,33
]for i in data:
q.put(i)
defanasysis
(q):
"""分析資料"""
while
true
:print
(q.get())
if q.empty():
break
a=multiprocessing.queue(3)
defmain()
: p1=multiprocessing.process(target=download_from_web,args=
(a,)
) p2=multiprocessing.process(target=anasysis,args=
(a,)
) p1.start(
) p2.start(
)if __name__==
"__main__"
: main(
)
執行結果:
d:\anaconda3\python.exe e:
/code/b.py
1122
33程序已結束,退出** 0
程序間訊息佇列通訊
要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...
程序間通訊(訊息佇列)
在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...
程序間通訊 訊息佇列
有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...