2016-07-23 32 views
0

我正在使用Python 2.7。我有一個多線程程序,其中線程使用subprocess模塊啓動命令。進程在系統上運行並偶爾向線程報告數據。大多數工作都是在進程中完成的 - 例如,線程只是從進程獲取信息並將它們寫入文件。Python中使用子進程和線程的效率

據我所知,有關於使用多線程與Python的限制。但在這種情況下,我預計所有繁重的工作都將由系統(Linux)完成,因爲所啓動的子進程正在執行CPU密集型工作。所以線程不必承受任何負載,因此不應該成爲瓶頸。

是我使用線程和子流程的理解一起在Python準確嗎?我認爲我理解的基礎部分是這些不同的子進程可以在不同的內核上運行,因此即使線程綁定到一個內核,進程也可以高效運行,線程可以在它們變得可用時從它們收集信息。

+0

是的,你是對的。 Python的GIL只允許一次運行一個線程,但該規則僅適用於python進程 - 所有子進程都是獨立運行的。由於python線程大多隻是在等待來自子進程的數據,所以它們不會相互干擾。 – tdelaney

回答

0

爲什麼不讓子進程自己處理數據處理呢?將東西傳遞迴過程需要額外的context switches以及序列化和反序列化的開銷,如果您有大量工作要返回到主進程,這可能會變得很重要。在子流程中使用線程可能更容易,而不是支付這個懲罰。

但是有一些重要的事情要注意。雖然I/O綁定代碼(文件寫入,在套接字上發送和接收數據等)不會遇到全局解釋器鎖定的瓶頸,但CPU綁定的任務將會。有關線程問題的更多信息,請參見Jesse Noller's blog post on threadsthe Python Wiki's article on the GIL

+0

有很多理由說明爲什麼子進程可能不適合從他們自己的stdout/stderr管道處理數據。也許主程序正在進行日誌記錄,希望將信息交織在單個文件中,或者將彙總數據用於自己的處理需求。假設這些是不能修改的第三方進程。通過多個進程傳輸數據是歷史悠久的linux/unix傳統。 – tdelaney

+0

@tdelaney他說他在自己的應用程序中使用'subprocess',因此我認爲他完全可以控制。是的,通過管道傳遞數據是Unix悠久的傳統,但它並不總是最有效的處理方式。 – Elizafox