Python signal发送自定义信号
在Python中,信号(signal)是一种在操作系统中处理进程间通讯的机制。当某个特定事件发生时,操作系统会向进程发送相应的信号,进程收到信号后会执行预先定义的处理函数。Python标准库中的signal模块允许Python程序捕获和处理来自操作系统的信号,同时也允许程序发送自定义信号。
什么是信号
信号是一个软件中断,它通知进程发生了某个事件。在Linux系统中,可以使用kill -l
命令查看系统支持的所有信号,如SIGKILL、SIGSTOP、SIGTERM等。在Python中,信号可以使用signal
模块来处理。
发送自定义信号
在Python中,可以使用os.kill
函数发送自定义信号。下面是一个简单的示例:
import os
import signal
pid = os.getpid()
os.kill(pid, signal.SIGUSR1)
print("Custom signal sent.")
上面的代码中,通过os.kill
函数向当前进程发送SIGUSR1
信号。我们可以通过下面的代码来捕获并处理这个信号:
import os
import signal
import time
def handler(signum, frame):
print(f"Received signal {signum}")
signal.signal(signal.SIGUSR1, handler)
print("Waiting for custom signal...")
while True:
time.sleep(1)
以上代码中,我们定义了一个名为handler
的信号处理函数,当收到SIGUSR1
信号时会调用该函数。接着我们使用signal.signal
函数将信号SIGUSR1
与处理函数关联起来。最后,程序进入一个无限循环,等待信号的到来。
当运行第一个脚本发送了自定义信号后,运行第二个脚本就会打印出类似如下的信息:
Waiting for custom signal...
Received signal 10
Received signal 10
Received signal 10
...
这表明我们成功发送了自定义信号,并实现了信号的捕获和处理。
发送自定义信号给指定进程
除了发送自定义信号给当前进程外,还可以发送自定义信号给其他进程。我们可以通过指定其他进程的进程号(PID)来发送信号。
下面是一个示例,我们先创建一个子进程,然后在父进程中向子进程发送自定义信号:
import os
import signal
import time
def child():
print(f"Child process PID: {os.getpid()}")
while True:
time.sleep(1)
pid = os.fork()
if pid == 0:
child()
else:
os.kill(pid, signal.SIGUSR1)
print("Custom signal sent to child process.")
这段代码首先创建了一个子进程,然后在父进程中向子进程发送SIGUSR1
信号。当运行代码时,可以看到类似如下的输出:
Child process PID: 1234
Custom signal sent to child process.
这表明父进程成功发送了自定义信号给子进程。
发送信号至指定线程
在多线程的程序中,我们有时也希望向指定的线程发送信号。但是由于Python解释器的GIL(全局解释器锁)限制,Python标准库并不提供直接发送信号给指定线程的接口。不过我们可以使用第三方库pycsp
来实现线程间通信,包括发送自定义信号。
下面是一个示例,展示了如何使用pycsp
库向指定线程发送信号:
from pycsp import *
@process
def threadA(cin, cout):
for i in range(10):
cout("Thread A Signal")
sleep(1)
@process
def threadB(cin, cout):
while True:
signal = cin()
print(f"Signal received in Thread B: {signal}")
Parallel(threadA, threadB)
在上面的代码中,我们定义了两个进程threadA
和threadB
,threadA
定期发送信号给threadB
,threadB
接收并处理信号。当运行代码时,可以看到类似如下的输出:
Signal received in Thread B: Thread A Signal
Signal received in Thread B: Thread A Signal
Signal received in Thread B: Thread A Signal
...
这表明我们成功使用pycsp
库实现了在线程间发送自定义信号的功能。
结语
本文介绍了如何在Python中发送自定义信号,并通过示例代码演示了发送自定义信号给当前进程、给其他进程以及给指定线程的方法。信号是进程间通讯中一种非常有效的机制,在适当的情况下可以帮助我们实现进程间的同步和通信。