3

我聽說從線程內調用os.waitpid時有問題。我還沒有遇到過這樣的問題(特別是使用os.WNOHANG選項)。但是我沒有太注意這種使用的性能影響。在Python中,在多線程程序中調用os.waitpid有什麼好處?

是否有任何性能處罰或其他應該注意的問題? 這是否與os.waitpid(潛在地)使用信號有關?

雖然我沒有看到信號如何相關,但從其他方面(我想)我無法從非主線程調用os.waitpid時返回。

回答

0

默認情況下,子進程死亡,父進程發送一個SIGCHLD信號。調用os.waitpid()的擔心可能來自於此。

如果Python的「信號」模塊文檔中查找相關的警告是相當清楚的:如果兩個信號和線程在同一程序中使用

一些必須小心。在同時使用信號和線程時要記住的基本事項是:始終在主線程中執行signal()操作。任何線程都可以執行alarm(),getsignal(),pause(),setitimer()或getitimer();只有主線程可以設置一個新的信號處理程序,並且主線程將是唯一接收信號的線程(即使底層線程實現支持向單個線程發送信號,這也是由Python信號模塊實施的)。這意味着信號不能用作線程間通信的手段。改爲使用鎖定。

http://docs.python.org/library/signal.html

但是...如果你獨自離開了SIGCHLD信號,那麼你應該高興地能夠調用os.waitpid()(或任何其他os.wait()變體)從一個線程。

主要缺點是你需要在WNOHANG中使用os.waitpid()並定期輪詢,如果你想以任何方式取消操作。如果你不需要取消os.waitpid(),那麼你可以在阻塞模式下調用它。

0

我的猜測是:人們只是在沒有WNOHANG的情況下調用waitpid(),這當然可以避免使用多線程的原因。 (當然,除非你只是用它來收割殭屍)。

相關問題