使用信号(Signals)在Python中进行进程间通信
在多进程编程中,进程间通信是一个重要的需求,在Unix/Linux操作系统中,信号(Signals)是一种常见的进程间通信方式,而在Python中,也可以使用`multiprocessing`库中的`Pipe`或者`Queue`实现进程间通信,但是如果你想更底层地了解信号的使用,那么可以继续阅读。
我们需要导入`signal`模块,该模块提供了对Unix信号的处理,在Unix系统中,信号是一种软件中断,可以由操作系统或者其他进程发送给某个进程,每个信号都有一个整数值和一个对应的名字。
在Python中,我们可以使用`signal.signal()`函数来设置某个信号的处理函数,该函数接受两个参数:要处理的信号和信号处理函数,信号处理函数是一个函数,当接收到指定的信号时,该函数会被调用。
下面是一个简单的例子,演示了如何使用信号来进行进程间通信:
import os import signal import time # 定义一个信号处理函数 def handle_signal(signum, frame): print(f"Received signal {signum} at {frame}") # 设置信号处理函数 signal.signal(signal.SIGINT, handle_signal) # 循环等待信号 while True: signal.pause()
在这个例子中,我们定义了一个信号处理函数`handle_signal()`,当接收到`SIGINT`信号时,该函数会被调用,并打印出接收到的信号和调用栈信息,然后我们使用`signal.signal()`函数将`SIGINT`信号的处理函数设置为`handle_signal()`,我们使用`signal.pause()`函数等待信号的到来。
现在我们可以运行这个程序,然后按下Ctrl+C来发送`SIGINT`信号给该程序,程序会接收到信号并调用`handle_signal()`函数,打印出接收到的信号和调用栈信息。
除了手动发送信号外,我们还可以使用`os.kill()`函数来发送信号给进程,下面是一个例子:
import os import signal import time # 定义一个进程 def worker(): print("Worker started") time.sleep(5) print("Worker finished") # 创建进程并启动 pid = os.fork() if pid == 0: worker() else: print(f"Created worker process {pid}") # 给worker进程发送信号 os.kill(pid, signal.SIGINT)