signal

admin 39 0

使用信号(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)