2011-05-16 93 views
3

如果你運行幾個線程,但他們都必須打印到相同的標準輸出,這是否意味着他們必須相互等待?所以說如果所有4個線程都有要寫的東西,他們必須暫停並等待stdout免費,以便他們繼續工作?python線程是否等待標準輸出?

+0

我會想象,標準輸出將有一個緩衝區,每個線程可以寫入並繼續,所以如果你有很多線程寫入緩衝區我想你可能會得到緩衝區溢出。但不知道。有興趣看看別人發佈的內容 – Richard 2011-05-16 11:28:31

回答

3

在操作系統的系統調用中,深度較深(深度較深......),是的。現代操作系統具有線程安全的終端打印例程,通常只鎖定實際設備訪問的關鍵部分(或緩衝區,取決於您寫入的內容以及設置是什麼)。然而,這些等待時間很短。請記住,這是你在這裏處理的IO,所以相對於實際的IO執行,等待時間可能是微不足道的。

0

這取決於。如果stdout是管道,則每個管道都會獲得一個4KB的緩衝區,您可以在創建管道時覆蓋該緩衝區。當緩衝區已滿或調用flush()時,緩衝區會被刷新。

如果stdout是終端,輸出通常是線路緩衝的。所以直到你打印換行符時,所有的線程都可以寫入它們的緩衝區。當寫入換行符時,整個緩衝區都被轉儲到控制檯上,並且所有其他線程必須等待,同時寫入換行符

由於線程執行的其他事情不是寫新行,所以每個線程都得到一些CPU。所以即使在最壞的情況下,堵塞也應該很小。但是有一個例外:如果你寫了很多數據或者控制檯速度很慢(就像使用串口的Linux內核調試控制檯一樣)。當控制檯不能處理數據量時,越來越多的線程會掛起,等待緩衝區刷新的新行的寫入。