信號是惟一的異步通訊方法node
一個進程向另外一個進程發送一個信號來傳遞某種信息,接受者根據傳遞的信息來作相應的事python
$ kill -l
查看系統信號說明git
$ kill -9 pid號
對進程發送信號github
信號名稱 | 說明 | ||
---|---|---|---|
1) SIGHUP | 鏈接斷開 | ||
2) SIGINT | ctrl+c | ||
3) SIGQUIT | ctrl+\ | ||
20) SIGTSTP | ctrl+z | ||
9) SIGKILL | 終止進程 | ||
19) SIGSTOP | 暫停進程 | ||
26) SIGVTALRM | 時鐘信號 | ||
17) SIGCHLD | 子進程退出時給父進程發的信號 | ||
在Python中import signal
能夠獲取信號web
os.kill(pid, sig)
windows
功能:發送信號多線程
參數app
import os import signal os.kill(12345,signal.SIGKILL) #殺死進程
signal.alarm(time)
less
我的理解:把發送信號的信息告知系統內核,應用層程序繼續運行,時間到以後利用內核告知應用層程序進行處理
import signal import time signal.alarm(3)#3秒後向自身發送一個時鐘信號 while True: time.sleep(1) print("等待時鐘信號") '''打印結果 等待時鐘信號 等待時鐘信號 鬧鐘 '''
signal.alarm(3)#3秒後向自身發送一個時鐘信號 time.sleep(2) signal.alarm(5)#進程只有一個時鐘信號,第二個會覆蓋上面的時鐘信號 while True: time.sleep(1) print("等待時鐘信號") '''打印結果 等待時鐘信號 等待時鐘信號 等待時鐘信號 等待時鐘信號 鬧鐘 '''
signal.pause()
signal.signal(signum, handler)
signum:要處理的信號
handler:信號的處理方法
SIG_DFL
表示使用默認方法處理
SIG_IGN
表示忽略這個信號
function
表示傳入一個函數,用指定的函數處理
def function(sig, frame)
sig:捕獲到的信號
frame:信號對象
import signal from time import sleep signal.alarm(5) # 5秒後向自身發送一個時鐘信號 # 使用信號的默認方法處理 # signal.signal(signal.SIGALRM,signal.SIG_DFL) # 忽略時鐘信號 # signal.signal(signal.SIGALRM,signal.SIG_IGN) # 忽略Ctrl+c信號 # signal.signal(signal.SIGINT,signal.SIG_IGN) while True: sleep(2) print("等待時鐘...")
# 使用自定義函數處理信號 import signal from time import sleep def fun1(sig, frame): if sig == signal.SIGALRM : print("接收到時鐘信號") elif sig == signal.SIGINT : print("ctrl+c就不結束") signal.alarm(5) # 5秒後向自身發送一個時鐘信號 # 使用自定義函數處理信號 # 處理時鐘信號 signal.signal(signal.SIGALRM,fun1) # 處理ctrl+c信號 signal.signal(signal.SIGINT,fun1) while True: print("等待") sleep(2) '''打印結果 等待 等待 等待 接收到時鐘信號 等待 ... '''
原理:給定一個數量對多個進程可見,且多個進程均可以操做,進程能夠對數量多少的判斷執行各自的行爲
from multiprocessing import Semaphore
sem = Semaphore(num)
sem.get_value()
:獲取信號量的值
sem.acquire()
:將信號量 -1,當信號爲0時會阻塞
sem.release()
:將信號量 +1
from multiprocessing import Semaphore, Process # 建立信號量對象 sem = Semaphore(num) def fun(): print("進程%d等待信號量"%os.getpid()) # 消耗一個信號量 sem.acquire() print("進程%d消耗信號量"%os.getpid()) # 添加一個信號量 sem.release() print("進程%d添加信號量"%os.getpid()) jobs = [] for i in range(4): p = Process(target = 4) jobs.append(p) p.start() for i in jobs: i.join() print(sem.get_value())
臨界資源:多個進程或者線程都能操做的共享資源
臨界區:操做臨界區資源的代碼段
同步:同步是一種合做關係,爲完成某個任務,多進程或者多線程之間造成的一種協調關係
互斥:互斥是一種制約關係,
from multiprocessing import Event
e = Event()
:建立一個事件對象e.wait([timeout])
:設置事件阻塞e.set()
:事件設置,當事件被設置後e.wait()
再也不阻塞,等於釋放資源區e.clear()
:清除設置,當事件被設置e.clear()
後,e.wait()
又會阻塞,阻塞資源區e.is_set()
:事件狀態判斷,判斷事件是否處於被設置的狀態from multiprocessing import Event # 建立事件對象 e = Event() # 查看 print(e.is_set()) # False e.set() print(e.is_set()) # True e.wait(3) print(e.is_set()) # True e.clear() print(e.is_set()) # False
from multiprocessing import Event,Process from time import sleep def wait_event1(): print("1想操做臨界區資源") e.wait() print("1開始操做臨界區資源",e.is_set()) with open("file") as f: print(f.read()) def wait_event2(): print("2也想操做臨界區資源") # 超時3秒檢測 e.wait(3) # 判斷是否被設置 if e.is_set(): print("2開始操做臨界區資源",e.is_set()) with open("file") as f: print(f.read()) else: print("2不能操做") # 建立事件對象 e = Event() p1 = Process(target = wait_event1) p2 = Process(target = wait_event2) p1.start() p2.start() print("主進程操做") with open("file",'w') as f: f.write("HELLO WORD") # 延遲4秒釋放臨界區 sleep(4) # 釋放臨界區資源 e.set() print("釋放臨界區") p1.join() p2.join()
from multiprocessing import Lock
lock = Lock()
:建立一個鎖對象lock.acquire()
:上鎖,若是已是上鎖狀態,調用此函數會阻塞lock.release()
:解鎖from multiprocessing import Lock,Process import sys def writer1(): # 上鎖 lock.acquire() for i in range(20): sys.stdout.write("writer1111\n") # 解鎖 lock.release() def writer2(): # 上鎖 lock.acquire() for i in range(20): sys.stdout.write("writer2222\n") # 解鎖 lock.release() lock = Lock() w1 = Process(target = writer1) w2 = Process(target = writer2) w1.start() w2.start() w1.join() w2.join()
第二種方法
使用with
語句上鎖,with語句執行完畢後會自動解
with lock:
.....
.....