[英]Python: is os.read() / os.write() on an os.pipe() threadsafe?
考慮:
pipe_read, pipe_write = os.pipe()
現在,我想知道兩件事:
(1)我有兩個主題。 如果我保證只有一個正在讀取os.read(pipe_read,n)
而另一個只是編寫os.write(pipe_write)
,那么即使兩個線程同時執行它,我也會遇到任何問題嗎? 我會獲得以正確順序寫入的所有數據嗎? 如果他們同時這樣做會發生什么? 是否有可能單個讀取片段,例如?:
Thread 1: os.write(pipe_write, '1234567')
Thread 2: os.read(pipe_read,big_number) --> '123'
Thread 2: os.read(pipe_read,big_number) --> '4567'
或者 - 再次考慮同時性 - 單個os.write(some_string)
總是完全由單個os.read(pipe_read, very_big_number)
?
(2)使用logging.handlers.FileHandler()
)考慮多個線程寫入管道的pipe_write
端 - 我已經讀過日志記錄模塊是線程安全的。 這是否意味着我可以做到這一點而不會丟失數據? 我想我將無法控制管道中數據的順序; 但這不是必需的。 要求:
logger.info(), logger.error(), ...
編寫的字符串必須保持一個整體。 這些要求是否得到滿足?
先感謝您,
Jan-Philip Gehrcke
從os.pipe
返回的兩個fds上的os.read
和os.write
是線程安全的,但你似乎要求更多。 Sub (1)
,是的,對於sinle讀取或寫入沒有“原子性”保證 - 您描述的場景(單個短寫入最終產生兩個讀取)是完全可能的。 (一般來說,os.whatever是操作系統功能的薄包裝,並且由操作系統來確保或無法確保您需要的功能;在這種情況下,Posix標准不需要操作系統確保這種“原子性”)。 您可以保證獲得所有已寫入的數據,並且順序正確,但就是這樣。 一旦填充了OS提供的緩沖區,一次寫入大量數據就會停止,只有在其他一些線程讀取了一些初始數據時才會停止(當然要注意死鎖!)等等。
Sub (2)
,是的,日志記錄模塊是線程安全的和“原子的”,因為通過對logging.info,logging.warn,logging.error等的單次調用產生的數據,就調用而言“保持一個整體”。底層處理程序(但是如果該處理程序依次使用非原子方式,如os.write,它可能仍會在內核中停頓,直到底層緩沖區被取消,等等,如上所述)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.