43 Python 多工程式設計 程序間的通訊

2021-09-25 12:36:56 字數 3971 閱讀 8627

在記憶體中開闢一段記憶體空間、形成管道結構。管道對多個程序可見,程序可以對管道進行讀寫操作

from multiprocessing import pipe

fd1,fd2=pipe(duplex=true)

功能:建立乙個管道

引數:預設為雙向管道,如果設定為false,則為單向管道

返回值:對於雙向管道fd1,fd2都可以進行讀寫操作;單相管道,fd1只可讀,fd2只能寫

讀寫操作:

fd.recv()–>從管道讀取內容;返回值為讀取的內容;如果管道無內容,則阻塞;

fd.send()–>向管道寫入內容;引數為傳送的內容;幾乎可以傳送所有python支援的資料

可以使⽤multiprocessing模組的queue實現多程序之間的資料傳遞,queue 本身是⼀個訊息列隊程式。

queue.qsize(): 返回當前佇列包含的訊息數量;

queue.empty(): 如果隊列為空,返回true,反之false ;

queue.full(): 如果佇列滿了,返回true,反之false;

queue.get([block[, timeout]]):

獲取佇列中的⼀條訊息,然後將其從列隊中移除,block預設值為true;

queue.get_nowait():

相當queue.get(false);

queue.put(item,[block[, timeout]]):

將item訊息寫⼊佇列,block預設值 為true;

queue.put_nowait(item):

相當queue.put(item, false)

拓展: 請使用例項化物件的方式實現訊息佇列的通訊方式.

1、乙個程序向另乙個程序通過訊號傳遞某種訊息,接收方在接收到訊號後進行相應的處理;

linux終端:

kill -l 檢視訊號名稱和編號

` kill -signum pid 給pid的程序傳送乙個訊號

(eg:kill -9 程序號 #殺死乙個程序)

程式執行的同步和非同步

同步:按照步驟一步一步順序執行

非同步:在程式執行中利用核心,不影響應用層程式持續執行

訊號是唯一的非同步通訊方式

關於訊號

訊號名稱:kill -l檢視到的名稱或編號

訊號含義:訊號的作用

預設行為:當乙個程序接收到訊號時採取的行為(終止程序,暫停程序,忽略產生)

e.g.

sighup   終端斷開

sigint ctrl + c

sigquit ctrl + \

sigtstp ctrl + z

sigkill 終止程序且不能被處理

sigstop 暫停程序且不能被處理

sigalrm 時鐘訊號

sigchld 子程序狀態改變發給父程序

通過python進行訊號處理:

os.kill(pid,sig)

功能:傳送訊號給某個程序

引數:pid 給哪個程序傳送訊號

sig:要傳送什麼訊號

signal.alarm(sec)

功能:一定時間後給自身傳送乙個slgalrm訊號

引數:指定時間

##乙個程序只能設定乙個時鐘,第二個時鐘會覆蓋之前的時間

signal.pause()

功能:阻塞等待乙個訊號的發生

signal.signal(signum,handler)

功能:處理訊號

引數: signum:要處理的訊號

handler:訊號處理的方法包含以下三種:

sig_dfl 使用預設方法處理

sig_ign 忽略這個訊號

func 自定義函式處理訊號

def func(sig,frame):

「sig—表示要處理的訊號;frame——訊號的結構物件」

*signal函式是乙個非同步處理函式

*signal函式不能處理sidstop訊號

*在父程序中使用signal(sigchld,slg——ign),這樣子程序退出時會交給系統處理,是解決殭屍程序的慣用手法

在記憶體中開闢一段空間,儲存資料,對於多個程序可見。每次寫入共享記憶體中的資料會覆蓋之前的內容

使用value建立共享記憶體

obj =value(ctype,obj)

功能:開闢共享記憶體空間

引數: ctype 字串 要轉變的c的資料型別

obj 共享記憶體的初始化資料

返回:共享記憶體物件

obj.value     	表示共享記憶體中的值。對其修改或者使用即可
使用array建立共享記憶體

obj = array(ctype,obj)

功能:開闢共享記憶體

引數:ctype 字串 要轉變的c的資料型別

obj 共享記憶體的初始化資料

1、列表:將列表存入共享記憶體,資料型別一致

2、正整數:表示開闢幾個資料空間

給定一定的數量,對多個程序可見並且多個程序根據訊號量的多少確定不同的行為(可用於操作共享的有限資源)

multiprocessing —> semaphore()

sem = semaphore(num)

功能:生成訊號量物件

引數: 訊號量的初始值

返回值: 訊號量物件

sem.acquire()   訊號量數量減1  訊號量為0時會阻塞

sem.release() 訊號量數量加1

sem.get_value() 獲取當前訊號量的值

linux程序間通訊還可以使用socket本地套接字,socket函式的第乙個引數設定為socket.af_unix表示建立本地套接字;使用方法類似與socket網路程式設計。此處不在論述。
目的:解決對共有資源操作產生的爭奪

臨界資源:多個程序或者執行緒都能夠操作的資源

臨界區:操作臨界資源的**段

同步:是一種合作關係,為完成某個任務,多程序或多執行緒之間形成的一種協調。按照約定依次執行對臨界資源的操作,相互告知相互促進。

互斥:互斥是一種制約關係,當乙個程序占有臨界資源就會進行加鎖的操作,此時其他程序就無法操作該臨界資源。直到使用的程序進行解鎖操作後才能使用

python中通過event事件或lock鎖實現同步互斥機制:

1.event

multiprocessing ---> event

e = event() #建立事件物件

e.wait([timeout]) #事件阻塞

e.set() #當e被set後,e.wait不再阻塞

e.clear() #當e被clear後,e.wait又會阻塞

e.is_set() #事件判斷 判斷當前事件物件是否被設定

2.lock

multiprocessing ---> lock

lock = lock()

lock.acquire() #上鎖

lock.release() #解鎖

*上鎖狀態執行acquire()操作會阻塞

*解鎖狀態執行acquire()不阻塞

使用上下文管理器實現:

lock = multiprocessing.lock()

with lock:--->上鎖

...--->with**段結束即解鎖

python 多工程式設計 程序

程序 想要實現多工可以使用程序來完成,概念 乙個正在執行的程式或者軟體就是乙個程序,它是作業系統進行資源發呢排的基本單位 乙個程式執行後至少有乙個程序,乙個程序預設有乙個執行緒,程序裡面可以建立多個執行緒,執行緒依附在程序裡面的,沒有程序就沒有執行緒。程序的使用 1 匯入程序包 import mul...

python 多工 程序

什麼是程序?程式是靜態的,當程式執行起來就叫做程序。程序是作業系統分配資源的基本單元。程序 執行緒的區別與優缺點 1.定義的不同 程序是系統進行資源分配的最小單位.執行緒是程序的乙個實體,是cpu進行排程的基本單位。執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源 如程式計數器,一組...

python 多工程式設計

多工 在同一時間內執行多個任務 多工的目的 多工的最大好處是充分利用cpu資源,提高程式的執行效率 併發 在一段時間內交替執行多個任務 並行 在同一時刻同時執行多個任務 程序 執行中的程式,分配資源的最小單位 執行緒 使用資源的最小單位 程序和執行緒的關係 乙個程式執行後至少有乙個程序,每個程序預設...