程序間通訊 佇列

2021-09-29 11:21:39 字數 2352 閱讀 8493

佇列:先進先出,後進後出

棧:先進後出,後進先出

之前的文章介紹過使用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 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...