欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中對(duì)信號(hào)的處理詳解

 更新時(shí)間:2021年07月05日 11:48:20   作者:鋼閘門(mén)  
這篇文章主要給大家介紹了關(guān)于python中對(duì)信號(hào)處理的相關(guān)資料, 計(jì)算機(jī)借助信號(hào)來(lái)接收和發(fā)送各種命令,操作系統(tǒng)針對(duì)其編程要接收或生成的每種命令列出了至少一個(gè)信號(hào),需要的朋友可以參考下

什么是信號(hào)

信號(hào)(signal)-- 進(jìn)程間通訊的一種方式,也可作為一種軟件中斷的方法。一個(gè)進(jìn)程一旦接收到信號(hào)就會(huì)打斷原來(lái)的程序執(zhí)行來(lái)按照信號(hào)進(jìn)行處理。

簡(jiǎn)化術(shù)語(yǔ),信號(hào)是一個(gè)事件,用于中斷運(yùn)行功能的執(zhí)行。信號(hào)始終在主Python線程中執(zhí)行。對(duì)于信號(hào),這里不做詳細(xì)介紹。

Python封裝了操作系統(tǒng)的信號(hào)功能的庫(kù) singal 的庫(kù)。singal 庫(kù)可以使我們?cè)趐ython程序中中實(shí)現(xiàn)信號(hào)機(jī)制。

Python的信號(hào)處理

首先需要了解Python為什么要提供 signal Library。信號(hào)庫(kù)使我們能夠使用信號(hào)處理程序,以便當(dāng)接收信號(hào)時(shí)都可以執(zhí)行自定義任務(wù)。

Mission:當(dāng)接收到信號(hào)時(shí)執(zhí)行信號(hào)處理方法

可以通過(guò)使用 signal.singal() 函數(shù)來(lái)實(shí)現(xiàn)此功能

Python對(duì)信號(hào)的處理

通常情況下Python 信號(hào)處理程序總是會(huì)在主 Python 主解析器的主線程中執(zhí)行,即使信號(hào)是在另一個(gè)線程中接收的。 這意味著信號(hào)不能被用作線程間通信的手段。 你可以改用 threading 模塊中的同步原語(yǔ)。

Python信號(hào)處理流程,需要對(duì)信號(hào)處理程序(signal handling )簡(jiǎn)要說(shuō)明。signal handling 是一個(gè)任務(wù)或程序,當(dāng)檢測(cè)到特定信號(hào)時(shí),處理函數(shù)需要兩個(gè)參數(shù),即信號(hào)id signal number (Linux 中 1-64),與堆棧幀 frame。通過(guò)相應(yīng)信號(hào)啟動(dòng)對(duì)應(yīng) signal handling ,signal.signal() 將為信號(hào)分配 處理函數(shù)。

如:當(dāng)運(yùn)行一個(gè)腳本時(shí),取消,此時(shí)是捕獲到一個(gè)信號(hào),可以通過(guò)捕獲信號(hào)方式對(duì)程序進(jìn)行異步的優(yōu)雅處理。通過(guò)將信號(hào)處理程序注冊(cè)到應(yīng)用程序中:

import signal  
import time 

def handler(a, b):  # 定義一個(gè)signal handling
    print("Signal Number:", a, " Frame: ", b)  
  
signal.signal(signal.SIGINT, handler)  # 將handle分配給對(duì)應(yīng)信號(hào)
  
while True:  
    print("Press ctrl + c")
    time.sleep(10)

如果不對(duì)對(duì)應(yīng)信號(hào)進(jìn)行捕獲處理時(shí),python將會(huì)拋出異常。

root@Seal:/mnt/d/pywork/signal# python signal.py
^CTraceback (most recent call last):
  File "signal.py", line 3, in <module>
    while True:
KeyboardInterrupt


信號(hào)枚舉

信號(hào)的表現(xiàn)為一個(gè)int,Python的信號(hào)庫(kù)有對(duì)應(yīng)的信號(hào)枚舉成員

其中常用的一般有,

SIGINT control+c

SIGTERM 終止進(jìn)程 軟件終止信號(hào)

SIGKILL 終止進(jìn)程 殺死進(jìn)程

SIGALRM 超時(shí)


信號(hào) 說(shuō)明
SIG_DFL
SIG_IGN 標(biāo)準(zhǔn)信號(hào)處理程序,它將簡(jiǎn)單地忽略給定的信號(hào)
SIGABRT SIGIOT 來(lái)自 abort 的中止信號(hào)。
abort 導(dǎo)致異常進(jìn)程終止。通常由檢測(cè)內(nèi)部錯(cuò)誤或嚴(yán)重破壞約束的庫(kù)函數(shù)調(diào)用。例如,如果堆的內(nèi)部結(jié)構(gòu)被堆溢出損壞, malloc() 將調(diào)用 abort()
SIGALRM
SIGVTALRM
SIGPROF
如果你用 setitimer 這一類(lèi)的報(bào)警設(shè)置函數(shù)設(shè)置了一個(gè)時(shí)限,到達(dá)時(shí)限時(shí)進(jìn)程會(huì)接收到 SIGALRM, SIGVTALRM 或者 SIGPROF。但是這三個(gè)信號(hào)量的含義各有不同,SIGALRM 計(jì)時(shí)的是真實(shí)時(shí)間,SIGVTALRM計(jì)時(shí)的是進(jìn)程使用了多少CPU時(shí)間,而 SIGPROF 計(jì)時(shí)的是進(jìn)程和代表該進(jìn)程的內(nèi)核用了多少時(shí)間。
SIGBUS 總線發(fā)生錯(cuò)誤時(shí),進(jìn)程接收到一個(gè)SIGBUS信號(hào)。舉例來(lái)說(shuō),存儲(chǔ)器訪問(wèn)對(duì)齊或者或不存在對(duì)應(yīng)的物理地址都會(huì)產(chǎn)生SIGBUS信號(hào)。
SIGCHLD 當(dāng)子進(jìn)程終止、被中斷或被中斷后恢復(fù)時(shí),SIGCHLD信號(hào)被發(fā)送到進(jìn)程。該信號(hào)的一個(gè)常見(jiàn)用法是指示操作系統(tǒng)在子進(jìn)程終止后清理其使用的資源,而不顯式調(diào)用等待系統(tǒng)調(diào)用。
SIGILL 非法指令。當(dāng)進(jìn)程試圖執(zhí)行非法、格式錯(cuò)誤、未知或特權(quán)指令時(shí),SIGILL信號(hào)被發(fā)送到該進(jìn)程。
SIGKILL 發(fā)送SIGKILL信號(hào)到一個(gè)進(jìn)程可以使其立即終止(KILL)。與SIGTERM和SIGINT相不同的是,這個(gè)信號(hào)不能被捕獲或忽略,接收過(guò)程在接收到這個(gè)信號(hào)時(shí)不能執(zhí)行任何清理。 以下例外情況適用:
SIGINT 來(lái)自鍵盤(pán)的中斷 (CTRL + C)。 KeyboardInterrupt
SIGPIPE 當(dāng)一個(gè)進(jìn)程試圖寫(xiě)入一個(gè)沒(méi)有連接到另一端進(jìn)程的管道時(shí),SIGPIPE信號(hào)會(huì)被發(fā)送到該進(jìn)程。
**SIGTERM ** 終結(jié)信號(hào)。 KILL -15 |KILL
SIGUSR1
SIGUSR2
用戶自定義信號(hào)
SIGWINCH 終端窗口大小已變化
SIGHUP 在控制終端上檢測(cè)到掛起或控制進(jìn)程的終止。

Reference:[signal-wikipedia](

信號(hào)函數(shù)

Python的信號(hào)庫(kù)中也有很多常用的函數(shù)

signal.alarm(time)

創(chuàng)建一個(gè) SIGALRM 類(lèi)型的信號(hào),time為預(yù)定的時(shí)間,設(shè)置為0時(shí)取消先前設(shè)置的定時(shí)器

signal.pause()

可以使代碼邏輯處理過(guò)程睡眠,直到收到信號(hào),然后調(diào)用對(duì)應(yīng)的handler。

import signal
import os
import time

def do_exit(sig, stack):
    raise SystemExit('Exiting')

signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGUSR1, do_exit)

print('My PID:', os.getpid())

signal.pause()

在執(zhí)行時(shí),忽略了ctrl + c的信號(hào),對(duì)USR1做退出操作

signal.setitimer(which, seconds, interval)

which: signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 或 signal.ITIMER_PROF

seconds:多少秒后觸發(fā)which。seconds設(shè)置為0可以清除which的計(jì)時(shí)器。

interval:每隔interval秒后觸發(fā)一次

os.getpid()

獲得當(dāng)前執(zhí)行程序的pid

Windows下信號(hào)的使用

在Linux中,可以通過(guò)任何可接受的信號(hào)枚舉值作為信號(hào)函數(shù)的參數(shù)。在Windows中,SIGABRT, SIGFPE, SIGINT, SIGILL, SIGSEGV, SIGTERM, SIGBREAK。

當(dāng)signal handling需要參數(shù)怎么辦

在一些時(shí)候,signal handling的操作需要對(duì)應(yīng)主進(jìn)程傳遞進(jìn)來(lái)一些函數(shù),而在整個(gè)項(xiàng)目中執(zhí)行過(guò)程中的變量與 signal handling不處于一個(gè)作用域中,而signal.signal() 不能傳遞其他的參數(shù),這個(gè)時(shí)候可以使用 partial 創(chuàng)建一個(gè)閉包來(lái)解決這個(gè)問(wèn)題。

例如:

import signal
import os
import sys
import time

from functools import partial

"""
這里signal frame默認(rèn)參數(shù)需要放到最后
"""
def signal_handler(test_parameter1, test_parameter2, signal_num, frame):
    print "signal {} exit. {} {}".format(signal_num, test_parameter1, test_parameter2)
    sys.exit(1)


a=1
b=2
signal.signal(signal.SIGINT, partial(signal_handler, a, b) )
print('My PID:', os.getpid())

signal.pause()

忽略信號(hào)

signal定義了忽略接收信號(hào)的方法。為了實(shí)現(xiàn)信號(hào)的處理,需要使用signal.signal() 將默認(rèn)的信號(hào)與signal.SIG_IGN 注冊(cè),即可忽略對(duì)應(yīng)的信號(hào)中斷,kill -9 不可忽略 。

import signal
import os
import time

def receiveSignal(signalNumber, frame):
    print('Received:', signalNumber)
    raise SystemExit('Exiting')
    return

if __name__ == '__main__':
    # register the signal to be caught
    signal.signal(signal.SIGUSR1, receiveSignal)

    # register the signal to be ignored
    signal.signal(signal.SIGINT, signal.SIG_IGN)

    # output current process id
    print('My PID is:', os.getpid())

    signal.pause()

常用的信號(hào)

import signal
import os
import time
import sys

def readConfiguration(signalNumber, frame):
    print ('(SIGHUP) reading configuration')
    return

def terminateProcess(signalNumber, frame):
    print ('(SIGTERM) terminating the process')
    sys.exit()

def receiveSignal(signalNumber, frame):
    print('Received:', signalNumber)
    return
 
    signal.signal(signal.SIGHUP, readConfiguration)
    signal.signal(signal.SIGINT, receiveSignal)
    signal.signal(signal.SIGQUIT, receiveSignal)
    signal.signal(signal.SIGILL, receiveSignal)
    signal.signal(signal.SIGTRAP, receiveSignal)
    signal.signal(signal.SIGABRT, receiveSignal)
    signal.signal(signal.SIGBUS, receiveSignal)
    signal.signal(signal.SIGFPE, receiveSignal)
    #signal.signal(signal.SIGKILL, receiveSignal)
    signal.signal(signal.SIGUSR1, receiveSignal)
    signal.signal(signal.SIGSEGV, receiveSignal)
    signal.signal(signal.SIGUSR2, receiveSignal)
    signal.signal(signal.SIGPIPE, receiveSignal)
    signal.signal(signal.SIGALRM, receiveSignal)
    signal.signal(signal.SIGTERM, terminateProcess)

總結(jié)

到此這篇關(guān)于python中對(duì)信號(hào)處理的文章就介紹到這了,更多相關(guān)python信號(hào)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過(guò)實(shí)例了解Python str()和repr()的區(qū)別

    通過(guò)實(shí)例了解Python str()和repr()的區(qū)別

    這篇文章主要介紹了通過(guò)實(shí)例了解Python str()和repr()的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)

    Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn)

    今天小編就為大家分享一篇Numpy將二維數(shù)組添加到空數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • php memcached的實(shí)例用法詳解

    php memcached的實(shí)例用法詳解

    在本篇文章里小編給大家整理了一篇關(guān)于php memcached的實(shí)例用法內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-10-10
  • TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例

    TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例

    這篇文章主要介紹了TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集的實(shí)現(xiàn)示例的過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • Python3?DataFrame缺失值的處理方法

    Python3?DataFrame缺失值的處理方法

    這篇文章主要介紹了Python3?DataFrame缺失值的處理,包括缺失值的判斷缺失值數(shù)據(jù)的過(guò)濾及缺失值數(shù)據(jù)的填充,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • python pyinstaller打包exe報(bào)錯(cuò)的解決方法

    python pyinstaller打包exe報(bào)錯(cuò)的解決方法

    這篇文章主要給大家介紹了關(guān)于python pyinstaller打包exe報(bào)錯(cuò)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python判斷telnet通不通的實(shí)例

    Python判斷telnet通不通的實(shí)例

    今天小編就為大家分享一篇Python判斷telnet通不通的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 解決Python計(jì)算矩陣乘向量,矩陣乘實(shí)數(shù)的一些小錯(cuò)誤

    解決Python計(jì)算矩陣乘向量,矩陣乘實(shí)數(shù)的一些小錯(cuò)誤

    今天小編就為大家分享一篇解決Python計(jì)算矩陣乘向量,矩陣乘實(shí)數(shù)的一些小錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • pytorch報(bào)錯(cuò)問(wèn)題:ValueError: num_samples should be a positive integer value, but got num_samples=0

    pytorch報(bào)錯(cuò)問(wèn)題:ValueError: num_samples should be

    這篇文章主要介紹了pytorch報(bào)錯(cuò)問(wèn)題:ValueError: num_samples should be a positive integer value, but got num_samples=0的解決方案,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 超詳細(xì)注釋之OpenCV Haar級(jí)聯(lián)檢測(cè)器進(jìn)行面部檢測(cè)

    超詳細(xì)注釋之OpenCV Haar級(jí)聯(lián)檢測(cè)器進(jìn)行面部檢測(cè)

    這篇文章主要介紹了OpenCV Haar級(jí)聯(lián)檢測(cè)器進(jìn)行面部檢測(cè),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論