如何在不使用信号的情况下“通知”感兴趣的子进程?
我正在寻找一种简单有效的方法,让父进程能够给子进程(通过SocketServer和ForkingMixIn创建的)发送信号。
虽然可以使用Unix信号,但我想避免使用它们,因为只有那些感兴趣的子进程才应该接收到信号。而且,如果要让父进程知道哪些子进程感兴趣,就需要一种注册机制,这样会显得过于复杂。
(请不要建议使用线程,因为这个特定的程序不适合使用线程,所以必须使用进程分叉。)
2 个回答
2
我想到了一个主意,就是用一个管道文件描述符,父进程可以往里面写数据,然后再读取或清空这些数据,结合使用select函数。不过,这样的设计感觉不是特别优雅。
具体来说:父进程会创建一个管道,子进程会继承这个管道,父进程往管道里写数据,这样就能唤醒任何在这个文件描述符上使用select()
的子进程。但是,父进程会立刻从管道的读取端读取数据并清空它——这样做的唯一效果就是那些在管道上使用select()
的子进程被唤醒了。
正如我所说的,这种做法感觉有点奇怪和不太好,但我还没找到更好的方法。
编辑:
结果发现,这种方法并不好用——有些子进程被唤醒了,有些却没有。我现在转而使用multiprocessing
模块里的Condition
。
3
因为你在使用unix系统,所以信号量应该是个简单的解决办法。可惜的是,python似乎没有提供直接调用信号量的系统方法。
如果你在用python 2.6,可能可以使用multiprocessing模块中的Condition类。