如何在不使用信号的情况下“通知”感兴趣的子进程?

1 投票
2 回答
668 浏览
提问于 2025-04-15 22:33

我正在寻找一种简单有效的方法,让父进程能够给子进程(通过SocketServer和ForkingMixIn创建的)发送信号。

虽然可以使用Unix信号,但我想避免使用它们,因为只有那些感兴趣的子进程才应该接收到信号。而且,如果要让父进程知道哪些子进程感兴趣,就需要一种注册机制,这样会显得过于复杂。

(请不要建议使用线程,因为这个特定的程序不适合使用线程,所以必须使用进程分叉。)

2 个回答

2

我想到了一个主意,就是用一个管道文件描述符,父进程可以往里面写数据,然后再读取或清空这些数据,结合使用select函数。不过,这样的设计感觉不是特别优雅。

具体来说:父进程会创建一个管道,子进程会继承这个管道,父进程往管道里写数据,这样就能唤醒任何在这个文件描述符上使用select()的子进程。但是,父进程会立刻从管道的读取端读取数据并清空它——这样做的唯一效果就是那些在管道上使用select()的子进程被唤醒了。

正如我所说的,这种做法感觉有点奇怪和不太好,但我还没找到更好的方法。

编辑:

结果发现,这种方法并不好用——有些子进程被唤醒了,有些却没有。我现在转而使用multiprocessing模块里的Condition

3

因为你在使用unix系统,所以信号量应该是个简单的解决办法。可惜的是,python似乎没有提供直接调用信号量的系统方法。

如果你在用python 2.6,可能可以使用multiprocessing模块中的Condition类。

撰写回答