程序間通訊之訊息佇列

2021-08-19 18:28:45 字數 2993 閱讀 7328

程序間通訊之訊息佇列

1.按照先進先出的原則來訪問訊息,先放入的訊息先被取出

2. 佇列中沒有訊息則為空佇列,這是無法執行取訊息的操作。佇列中訊息個數達到上限則為滿佇列此時無法存入訊息

3. 不同程序間,通過向佇列存入和獲取訊息來達到通訊的目的

from multiprocessing import queue

q = queue(maxsize)

功能 :建立訊息佇列物件

maxsize : 設定訊息佇列大小,表示最多存多少個訊息

q.put(obj,block = true,timeout = none)

功能:向佇列中存入訊息

obj :要存入的物件

block:是否是阻塞模式,預設是true 如果設定為false為非阻塞

timeout: 當block = true時為阻塞時間

q.get()

功能:從佇列中取出乙個訊息

block:預設為true 表示阻塞,設定為false表示為非阻塞則如果隊列為空立即返回empty異常

timeout: block= true 時 表示阻塞等待時間,超時則返回異常

q.full()

判斷佇列是否為滿,如果滿則返回true否則返回false

q.empty()

判斷佇列是否為空,如果空則返回true否則返回false

q.qsize()

檢視當前佇列中訊息的個數

練習:父程序 : 從終端獲取輸入內容,放入到訊息佇列

子程序 : 從訊息佇列中得到內容,然後列印出來

共享記憶體:

特點 :1. 效率高的程序間通訊方式

2. 安全性上有風險,因為內容的存放是會覆蓋原有內容的,所以在使用時很可能已經被篡改

3. 基於2的原因,在使用時經常需要考慮加鎖問題

from multiprocessing import value,array

1.兩種方法使用上基本相同,value在共享記憶體存放乙個數值,array可以存放多個數值,但是型別必須相同

2.任意的程序對共享記憶體中的資料進行修改後,即其他程序也會獲得修改後的資料

3. 兩個方法第乙個引數相同,都是ctypes,詳見表。第二個引數 value為乙個相應型別的數值,array可以是數值(表示開闢乙個包含多少資料的記憶體空間填充0),也可以是乙個迭代物件(會給距迭代內容開闢空間並且將內容進行填充)

管道 訊息佇列 共享記憶體

開闢空間 記憶體 記憶體 記憶體

讀寫方式 可雙向 單向 先進先出 操作記憶體

訊息流 個數 數值陣列

send/recv put/get 直接修改

效率 一般 一般 快

是否需要 不需要 不需要 需要

互斥訊號 :

是一種非同步的程序間通訊方式

訊號 有其名稱,含義,和預設行為

傳送訊號

import os

os.kill(pid,sig)

功能:向乙個程序傳送乙個訊號

pid : 向哪個程序傳送,該程序的pid號

sig : 傳送什麼訊號 使用 signal.signum

signal.alarm(sec)

功能:向自身傳送乙個訊號

sec: 在sec秒後訊號會被傳送

* 乙個程序中只能掛起乙個時鐘訊號

處理訊號

signal.pause()

功能:掛起等待乙個訊號

signal.signal(signum,handler)

功能:處理乙個訊號

引數: signum : 要處理的訊號

handler: 對訊號的處理方法

處理方法:忽略該訊號 sig_ign

使用預設方法執行 sig_dfl

使用指定方法執行 function

非同步處理 : 在某一時刻使用signal撲捉訊號,會告知核心幫程序監控,而不是阻塞等待。在程序的生命週期內,只要有該訊號傳送進來就會處理。

殭屍程序處理

父程序在子程序執行結束前加入:

signal.signal(signal.sigchld,signal.sig_ign)

同步和互斥

臨界資源 : 對多個程序或執行緒可見,容易產生爭奪的資源(如共享記憶體)稱之為臨界資源

臨界區 : 對臨界資源進行操作的**段,稱之為臨界區

同步 : 同步是一種制約關係,為完成某種任務而建立兩個或多個程序,程序間協調而有次序的等待,傳遞資訊,完成工作。這種制約源於程序間的合作

互斥 :互斥是一種間接的制約,當乙個程序進入臨界區進行加鎖,其他程序此時無法操作臨界資源,只有當該程序結束對臨界資源的使用後,進行解鎖,其他程序才可以使用。這種技術往往是通過阻塞完成的

同步互斥方法

event

e = event() 建立事件物件

e.is_set() 判斷事件是否被設定

e.set() 對事件物件進行設定

e.wait(2) 阻塞等待時間被設定 (引數表示超時時間)

lock

from multiprocessing import lock

lock = lock()

lock.acquire() 上鎖

lock.release() 解鎖

with lock: 上鎖

作業 :

司機和售票員的故事

1. 建立父子程序分別表示司機和售票員

2. 當售票員撲捉 sigint 訊號時 ,傳送sigusr1給司機,司機列印(『發車了』)

當售票員捕捉到 sigquit 訊號時,傳送sigusr2給司機,司機列印('停車')

司機捕捉到 sigtstp, 傳送 sigusr1給售票員,

售票員列印(『到站了 請下車』)

3.到站後司機等待售票員先下車,然後自己exit

程序間通訊之訊息佇列

include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...

程序間通訊之訊息佇列

訊息佇列其實就是提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。此外,訊息佇列和管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列不一定是先入先出。訊息佇列與命名管道有一樣的不足,就是每個訊息的最大長度是有上限的 msgm...

程序間通訊之訊息佇列

訊息佇列 訊息佇列本質上是提供了一種從乙個程序向另乙個程序傳送資料快的方法。每個資料快都被認為是有乙個型別,接受者程序接收的資料塊可以有不同的型別值。訊息佇列和管道的區別 1 訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先進先出的。2 訊息佇列的生命週期是隨核心的 不隨程序...