2016-02-07 49 views
0

背景:文件系統中的ACID事務

我正在通過串行連接從arduino獲取溫度浮點數。我需要能夠每隔30秒緩存一次溫度數據,以便其他應用程序(例如網絡,恆溫控制器)訪問並且不會超載串行連接。

目前我緩存這些數據到RAM作爲文件在/運行(我試圖遵循Linux約定)。然後,其他應用程序可以通過I/O現在唯一的瓶頸(使用rpi,因此這裏沒有很多企業級需求)來輪詢文件的溫度,因爲它們整天都需要它。

問題:

我認爲,當一個應用程序讀取這些文件,它的風險讀取損壞的數據。如果作者更新文件,讀者嘗試同時讀取文件,可能會破壞數據讀取,導致恆溫器表現不正常?

我應該只使用sqlite3作爲一種矯枉過正的解決方案,或者使用文件鎖定(並且這樣做有其他風險,但不能完美工作)?

這一切都發生在多個python進程中。 Linux能夠在本地處理這種情況,還是需要以某種方式應用here提及的原則?

+2

我認爲一個'write(2)'調用應該是[Linux下的原子](http://article.gmane.org/gmane.linux.kernel/43445)。 – a3f

+0

有趣的是,這已經產生了大量的閱讀。我應該澄清,這些過程(一個寫,一個讀)正在python中發生。這會影響到什麼嗎? – mh00h

+1

你可以用'strace(1)'檢查什麼系統調用被調用,或者只是使用'os.write',它應該直接映射到'write(2)',並提供相同的語義。 – a3f

回答

1

致電write(2)應該是atomic under Linux

這意味着只要您正在編寫單個緩衝區,就可以確定讀者不會讀取不完整的記錄。您可能希望使用os.write以確保不會發生緩衝/分塊,但您不知道。

如果讀取正在發生並且文件被更新,讀取將在文件中間使用新數據,還是以某種方式知道如何從舊文件獲取數據?

如果確切有一個read(2)和一個write(2),您可以保證看到一致的結果。如果將寫入分爲兩部分,可能發生的是寫入第一部分,然後讀取第二部分,這會違反原子性。如果您需要編寫多個緩衝區,請自行組合它們或使用writev(2)