在Python中,多个线程中调用os.waitpid的缺点是什么?

3 投票
2 回答
2701 浏览
提问于 2025-04-16 15:54

我听说在一个线程里调用os.waitpid可能会有问题。不过我自己还没有遇到过这些问题,尤其是使用os.WNOHANG这个选项的时候。虽然如此,我也没有特别关注这种用法对性能的影响。

有没有什么性能上的损失或者其他需要注意的问题呢?这和os.waitpid可能使用信号有关吗?

不过我不太明白信号怎么会有关系,因为如果有关系的话,我想我就不能在非主线程中调用os.waitpid并让它返回了。

2 个回答

0

我猜:大家只是说在调用waitpid()的时候没有加上WNOHANG这个选项,这样做就失去了使用多线程的初衷。(当然,除非你只是想用它来处理僵尸进程)。

0

默认情况下,当一个子进程结束时,父进程会收到一个叫做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(),那么可以直接在阻塞模式下调用它。

撰写回答