【问题标题】:How to "signal" interested child processes (without signals)?如何“发出信号”感兴趣的子进程(没有信号)?
【发布时间】:2011-02-17 19:08:44
【问题描述】:
我正在尝试找到一种简单的好方法来向子进程发出信号
(通过带有 ForkingMixIn 的 SocketServer 创建)来自父级
过程。
虽然可以使用 Unix 信号,但我想避免使用它们,因为只有
有兴趣的孩子应该收到信号,它会是
需要某种注册的矫枉过正和复杂
向感兴趣的父进程识别的机制。
(请不要推荐线程,因为这个特定的程序不会工作
使用线程,因此必须使用分叉。)
【问题讨论】:
标签:
python
unix
fork
subprocess
signals
【解决方案1】:
我想出了使用管道文件描述符的想法,父级可以写入,然后结合 select 进行读取/刷新,但这并不是一个非常优雅的设计。
更详细地说:父进程将创建一个管道,子进程将继承它,父进程将写入管道,从而唤醒文件描述符上的任何子进程select():ing,但 父进程 然后会立即从管道的读取端读取并清空它 - 唯一的影响是那些在管道上 select():ing 的子进程已经唤醒。
正如我所说,这感觉奇怪而丑陋,但我还没有找到更好的东西。
编辑:
事实证明这是行不通的——有些子进程被唤醒,有些则没有。我已经使用了来自multiprocessing 模块的Condition。
【解决方案2】:
由于您使用的是 unix 系统,因此信号量应该是最简单的答案。
不幸的是,python 似乎没有提供调用 semop 系统调用的方法。
如果您使用的是 python 2.6 ,则可以使用
multiprocessing module 条件类。