簡體   English   中英

Python:在os.pipe()threadsafe上是os.read()/ os.write()嗎?

[英]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.reados.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM