中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中如何對信號進行處理

發布時間:2021-07-05 14:37:04 來源:億速云 閱讀:647 作者:小新 欄目:開發技術

這篇文章主要介紹了python中如何對信號進行處理,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    什么是信號

    信號(signal)-- 進程間通訊的一種方式,也可作為一種軟件中斷的方法。一個進程一旦接收到信號就會打斷原來的程序執行來按照信號進行處理。

    簡化術語,信號是一個事件,用于中斷運行功能的執行。信號始終在主Python線程中執行。對于信號,這里不做詳細介紹。

    Python封裝了操作系統的信號功能的庫 singal 的庫。singal 庫可以使我們在python程序中中實現信號機制。

    Python的信號處理

    首先需要了解Python為什么要提供 signal Library。信號庫使我們能夠使用信號處理程序,以便當接收信號時都可以執行自定義任務。

    Mission:當接收到信號時執行信號處理方法

    可以通過使用 signal.singal() 函數來實現此功能

    Python對信號的處理

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

    Python信號處理流程,需要對信號處理程序(signal handling )簡要說明。signal handling 是一個任務或程序,當檢測到特定信號時,處理函數需要兩個參數,即信號id signal number (Linux 中 1-64),與堆棧幀 frame。通過相應信號啟動對應 signal handling ,signal.signal() 將為信號分配 處理函數。

    如:當運行一個腳本時,取消,此時是捕獲到一個信號,可以通過捕獲信號方式對程序進行異步的優雅處理。通過將信號處理程序注冊到應用程序中:

    import signal  
    import time 
    
    def handler(a, b):  # 定義一個signal handling
        print("Signal Number:", a, " Frame: ", b)  
      
    signal.signal(signal.SIGINT, handler)  # 將handle分配給對應信號
      
    while True:  
        print("Press ctrl + c")
        time.sleep(10)

    python中如何對信號進行處理

    如果不對對應信號進行捕獲處理時,python將會拋出異常。

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

    信號枚舉

    信號的表現為一個int,Python的信號庫有對應的信號枚舉成員

    其中常用的一般有,

    SIGINT control+c

    SIGTERM 終止進程 軟件終止信號

    SIGKILL 終止進程 殺死進程

    SIGALRM 超時

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

    Reference:[signal-wikipedia](

    信號函數

    Python的信號庫中也有很多常用的函數

    signal.alarm(time)

    創建一個 SIGALRM 類型的信號,time為預定的時間,設置為0時取消先前設置的定時器

    signal.pause()

    可以使代碼邏輯處理過程睡眠,直到收到信號,然后調用對應的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()

    在執行時,忽略了ctrl + c的信號,對USR1做退出操作

    signal.setitimer(which, seconds, interval)

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

    seconds:多少秒后觸發which。seconds設置為0可以清除which的計時器。

    interval:每隔interval秒后觸發一次

    os.getpid()

    獲得當前執行程序的pid

    Windows下信號的使用

    在Linux中,可以通過任何可接受的信號枚舉值作為信號函數的參數。在Windows中,SIGABRT, SIGFPE, SIGINT, SIGILL, SIGSEGV, SIGTERM, SIGBREAK。

    當signal handling需要參數怎么辦

    在一些時候,signal handling的操作需要對應主進程傳遞進來一些函數,而在整個項目中執行過程中的變量與 signal handling不處于一個作用域中,而signal.signal() 不能傳遞其他的參數,這個時候可以使用 partial 創建一個閉包來解決這個問題。

    例如:

    import signal
    import os
    import sys
    import time
    
    from functools import partial
    
    """
    這里signal frame默認參數需要放到最后
    """
    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()

    忽略信號

    signal定義了忽略接收信號的方法。為了實現信號的處理,需要使用signal.signal() 將默認的信號與signal.SIG_IGN 注冊,即可忽略對應的信號中斷,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()

    常用的信號

    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)

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“python中如何對信號進行處理”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    遵化市| 汝阳县| 二连浩特市| 和静县| 莲花县| 石台县| 滕州市| 伊金霍洛旗| 牡丹江市| 河津市| 容城县| 新晃| 汝南县| 亳州市| 澳门| 盱眙县| 甘孜| 济南市| 绥德县| 西平县| 中卫市| 偃师市| 于田县| 西林县| 伊吾县| 柳河县| 临澧县| 八宿县| 葵青区| 观塘区| 积石山| 巫溪县| 揭东县| 佛坪县| 韶关市| 临湘市| 杨浦区| 翁牛特旗| 高尔夫| 拉萨市| 长垣县|