在Python中,多个线程中调用os.waitpid的缺点是什么?
我听说在一个线程里调用os.waitpid可能会有问题。不过我自己还没有遇到过这些问题,尤其是使用os.WNOHANG这个选项的时候。虽然如此,我也没有特别关注这种用法对性能的影响。
有没有什么性能上的损失或者其他需要注意的问题呢?这和os.waitpid可能使用信号有关吗?
不过我不太明白信号怎么会有关系,因为如果有关系的话,我想我就不能在非主线程中调用os.waitpid并让它返回了。
2 个回答
我猜:大家只是说在调用waitpid()的时候没有加上WNOHANG这个选项,这样做就失去了使用多线程的初衷。(当然,除非你只是想用它来处理僵尸进程)。
默认情况下,当一个子进程结束时,父进程会收到一个叫做SIGCHLD的信号。大家可能会担心要调用os.waitpid(),这就是原因所在。
如果你查看Python的“signal”模块的文档,会发现有个警告说得很清楚:
如果在同一个程序中同时使用信号和线程,需要特别小心。记住一个基本的原则:一定要在主线程中进行信号的操作。任何线程都可以使用alarm()、getsignal()、pause()、setitimer()或getitimer()这些函数;但是只有主线程可以设置新的信号处理器,并且只有主线程会接收到信号(这是Python信号模块强制执行的,即使底层的线程实现支持将信号发送到单独的线程)。这意味着信号不能用作线程之间的通信工具。建议使用锁来代替。
http://docs.python.org/library/signal.html
但是……如果你不去处理SIGCHLD信号,那么你应该可以愉快地在一个线程中调用os.waitpid()(或者其他任何os.wait()的变体)。
主要的缺点是,如果你想要有办法取消这个操作,就需要使用os.waitpid()配合WNOHANG,并定期进行轮询。如果你根本不需要取消os.waitpid(),那么可以直接在阻塞模式下调用它。