搜尋
首頁後端開發Python教學Python使用signal模組實現定時執行

在liunx系統中要想每隔一分鐘執行一個命令,最普遍的方法就是crontab了,如果不想使用crontab,經同事指點在程序中可以用定時器實現這種功能,於是就開始摸索了,發現需要一些訊號的知識...

查看你的linux支援哪些訊號:kill -l 即可

root@server:~# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
root@server:~#

訊號:進程之間通訊的方式,是一體通訊的方式種軟體中斷。一個行程一旦接收到訊號就會打斷原來的程式執行流程來處理訊號。作業系統規定了進程收到訊號以後的預設行為,但是,我們可以透過綁定訊號處理函數來修改進程收到訊號以後的行為,有兩個訊號是不可變更的SIGTOP和SIGKILL。

發送訊號一般有兩種原因:

1(被動式)  核心偵測到一個系統事件.例如子行程退出會像父行程發送SIGCHLD訊號.鍵盤按下control+c會傳送SIGINT訊號

2(主動式)  透過系統呼叫kill來向指定進程發送訊號

在C語言中有個setitimer函數,函數setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都會發送定時訊號到進程,並且自動重新計時。參數which確定了定時器的類型:

ITIMER_REAL       定時真實時間,與alarm類型相同。              SIGALRM

ITIMER_VIRT       定時程序在使用者狀態下的實際執行時間。            SIGVTALRM

ITIMER_PROF       定時程序在使用者態與核心態的實際執行時間。      SIGPROF

這三種定時器定時完成時給程序發送的信號各不相同,其中ITIMER_REAL類定時器發送SIGALRM信號,ITIMER_VIRT類定時器發送SIGVTALRM信號,ITIMER_REAL類定時器發送SIGPROF信號。

函數alarm本質上設定的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,並且每次設定只能產生一次定時。函數setitimer設定的定時器則不同,它們不但可以計時到微妙(理論上),還能自動循環定時。在一個Unix行程中,不能同時使用alarm和ITIMER_REAL類別計時器。

SIGINT    終止進程    中斷進程 (control+c)

SIGTERM   終止進程    軟體終止訊號

SIGKILL   終止進程    軟體終止訊號

SIGKILL   終止進程    軟體終止訊號

SIGKILL   終止進程 差不多了,該向python的signal進軍了。

定義訊號名稱

signal套件定義了各個訊號名稱及其對應的整數,例如

import signal
print signal.SIGALRM
print signal.SIGCONT

Python所使用的訊號名稱和Linux一致。你可以透過

$man 7 signal

查詢

預設訊號處理函數

signal套件的核心是使用signal.signal()函數來預設(register)訊號處理函數,如下:

singnal.signal( signalnum, handler)

signalnum為某個訊號,handler為此訊號的處理函數。我們在訊號基礎裡提到,進程可以無視訊號,可以採取預設操作,還可以自訂操作。當handler為signal.SIG_IGN時,訊號被無視(ignore)。當handler為singal.SIG_DFL,進程採取預設操作(default)。當handler為一個函數名稱時,進程採取函數中定義的操作。

import signal
# Define signal handler function
def myHandler(signum, frame):
  print('I received: ', signum)
  
# register signal.SIGTSTP's handler 
signal.signal(signal.SIGTSTP, myHandler)
signal.pause()
print('End of Signal Demo')

在主程式中,我們首先使用signal.signal()函數來預設訊號處理函數。然後我們執行signal.pause()來讓該行程暫停以等待訊號,以等待訊號。當訊號SIGUSR1被傳遞給該進程時,進程從暫停中恢復,並根據預設,執行SIGTSTP的訊號處理函數myHandler()。 myHandler的兩個參數一個用來辨識訊號(signum),另一個用來獲得訊​​號發生時,進程棧的狀況(stack frame)。這兩個參數都是由signal.singnal()函數來傳遞的。

上面的程式可以保存在一個檔案中(例如test.py)。我們使用以下方法運行:

$python test.py

以便讓進程運行。當程式運行到signal.pause()的時候,進程暫停並等待訊號。此時,透過按下CTRL+Z向該進程發送SIGTSTP訊號。我們可以看到,進程執行了myHandle()函數, 隨後返回主程序,繼續執行。 (當然,也可以用$ps查詢process ID, 再使用$kill來發出信號。)

(進程並不一定要使用signal.pause()暫停以等待信號,它也可以在進行工作中接受信號,例如將上面的signal.pause()改為一個需要長時間工作的循環。

定時發出SIGALRM訊號

一個有用的函數是signal.alarm(),它被用於在一定時間之後,向進程自身發送SIGALRM訊號:

import signal
# Define signal handler function
def myHandler(signum, frame):
  print("Now, it's the time")
  exit()
  
# register signal.SIGALRM's handler 
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:
  print('not yet')

我们这里用了一个无限循环以便让进程持续运行。在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。 

发送信号

signal包的核心是设置信号处理函数。除了signal.alarm()向自身发送信号之外,并没有其他发送信号的功能。但在os包中,有类似于linux的kill命令的函数,分别为  

os.kill(pid, sid)
os.killpg(pgid, sid)

分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所对应的整数或者singal.SIG*。

实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数,在这里,我们只不过是用Python语言来实现了一下。实际上,Python 的解释器是使用C语言来编写的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

Python執行,那是什麼?Python執行,那是什麼?May 14, 2025 am 12:06 AM

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python:關鍵功能是什麼Python:關鍵功能是什麼May 14, 2025 am 12:02 AM

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用