在記憶體中開闢一段記憶體空間、形成管道結構。管道對多個程序可見,程序可以對管道進行讀寫操作
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資源,提高程式的執行效率 併發 在一段時間內交替執行多個任務 並行 在同一時刻同時執行多個任務 程序 執行中的程式,分配資源的最小單位 執行緒 使用資源的最小單位 程序和執行緒的關係 乙個程式執行後至少有乙個程序,每個程序預設...