>  기사  >  백엔드 개발  >  Python이 신호 모듈을 사용하여 예약된 실행 방법을 구현하는 방법에 대한 자세한 설명

Python이 신호 모듈을 사용하여 예약된 실행 방법을 구현하는 방법에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-03-19 15:24:501380검색

liunx 시스템에서 1분마다 명령을 실행하고 싶다면 가장 일반적인 방법은 crontab을 사용하는 것입니다. crontab을 사용하지 않으려면 동료들이 타이머 이 기능을 구현하려면 프로그램에서 탐색을 시작했고 신호 지식이 필요하다는 사실을 발견했습니다...

linux가 지원하는 신호를 확인하세요. kill -l can

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를 상위 프로세스로 보냅니다. 키보드에서 Ctrl+C를 누르면 SIGINT 신호

2(활성)가 전송됩니다. 시스템은 지정된 프로세스

C 언어

setitimer 함수는 서로 독립적인 세 개의 타이머를 제공할 수 있으며 시간이 완료되면 타이밍 신호가 프로세스에 전송됩니다. 시간이 자동으로 재설정됩니다. 타이머 유형을 결정하는 매개변수: ITIMER_REAL 실시간 타이밍, 알람 유형과 동일합니다. SIGALRM

ITIMER_VIRT 사용자 모드에서 예약된 프로세스의 실제 실행 시간입니다. SIGVTALRM

ITIMER_PROF 사용자 모드 및 코어 모드에서 예약된 프로세스의 실제 실행 시간입니다. SIGPROF

이 세 가지 타이머는 타이밍이 완료되면 프로세스에 서로 다른 신호를 보냅니다. 그 중 ITIMER_REAL 클래스 타이머는 SIGALRM 신호를 보내고, ITIMER_VIRT 클래스 타이머는 SIGVTALRM 신호를 보내고, ITIMER_REAL 클래스 타이머는 SIGPROF 신호.

알람 기능은 기본적으로 정밀도가 낮고 과부하가 없는 ITIMER_REAL 타이머를 설정합니다. 이는 초 단위까지만 정확할 수 있으며 각 설정은 하나의 타이머만 생성할 수 있습니다. setitimer 함수에 의해 설정된 타이머는 (이론적으로) 마이크로초까지 시간을 측정할 수 있을 뿐만 아니라 자동으로

루프

타이밍을 지정할 수도 있습니다. Unix 프로세스에서는 알람과 ITIMER_REAL 타이머를 동시에 사용할 수 없습니다. SIGINT 프로세스 종료 프로세스 중단(control+c)

SIGTERM 프로세스 종료 소프트웨어 종료 신호

SIGKILL 프로세스 종료 프로세스 종료

SIGALRM 경보 신호

사전 지식이 거의 준비되었으니 이제

python

의 시그널로 이동할 시간입니다. 신호 이름 정의

신호 패키지는 각 신호 이름과 해당

정수

를 정의합니다. 예를 들어

import signal
print signal.SIGALRM
print signal.SIGCONT
Python에서 사용하는 신호 이름은 다음과 같습니다. 리눅스와 일치합니다.

preset 신호 처리 함수는

$man 7 signal

를 통해 쿼리할 수 있습니다. signal 패키지의 핵심은 signal.signal() 함수를 사용하여 신호를 미리 설정(등록)하는 것입니다. 신호 처리 함수는 다음과 같습니다.

singnal.signal(signalnum, handler)

signalnum은 신호이고 handler는 신호를 처리하는 함수입니다. 신호 기본 사항에서 프로세스가 신호를 무시하거나 기본 작업을 수행하거나 작업을 사용자 정의할 수 있다고 언급했습니다. 핸들러가 signal.SIG_IGN이면 신호가 무시됩니다. 핸들러가 singal.SIG_DFL이면 프로세스는 기본 작업(기본값)을 수행합니다. 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)를 식별하는 데 사용되고, 다른 하나는 신호가 발생할 때 프로세스 스택(스택 프레임)의 상태를 가져오는 데 사용됩니다. 두 매개변수 모두 signal.singnal() 함수에 의해 전달됩니다.

上面的程序可以保存在一个文件中(比如test.py)。我们使用如下方法运行:

$python test.py

以便让进程运行。当程序运行到signal.pause()的时候,进程暂停并等待信号。此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。我们可以看到,进程执行了myHandle()函数, 随后返回主程序,继续执行。(当然,也可以用$ps查询process ID, 再使用$kill来发出信号。)

(进程并不一定要使用signal.pause()暂停以等待信号,它也可以在进行工作中接受信号,比如将上面的signal.pause()改为一个需要长时间工作的循环。)

我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。

定时发出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包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。

위 내용은 Python이 신호 모듈을 사용하여 예약된 실행 방법을 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.