背景:
我通过串行连接从arduino获得温度漂浮。我需要能够每隔30秒为其他应用程序(例如网络,恒温控制器)缓存此温度数据,以便访问并且不会使串行连接过载。
目前我将这些数据作为/ run中的文件缓存到RAM中(我正在尝试遵循Linux惯例)。然后,其他应用程序可以根据需要整天调查文件的温度,而i / o现在是唯一的瓶颈(使用rpi,因此这里没有很多企业级需求)。
问题:
我认为当应用程序读取这些文件时,它可能会读取损坏的数据。如果作者更新文件,并且读者试图同时读取文件,可能会损坏数据,导致恒温器表现不正常吗?
我应该只使用sqlite3作为过度杀伤解决方案,还是使用文件锁(这样做会不会有其他不完美的工作)?
这一切都发生在多个python进程中。 Linux是否能够原生地处理这种情况,还是我需要以某种方式应用here提到的原则?
答案 0 :(得分:1)
致write(2)
的电话应为atomic under Linux。
这意味着只要您编写单个缓冲区,就可以确定读者不会读取不完整的记录。您可能希望使用os.write
来确保没有发生您不知道的缓冲/分块。
如果正在进行读取并且文件已更新,那么读取是否会在文件中间使用新数据,或者以某种方式知道如何从旧文件中获取数据(如何)?
如果只有一个read(2)
和一个write(2)
,则可以保证看到一致的结果。如果将写入分成两部分,则可能会发生写入第一部分,读取然后写入第二部分,这将是原子性违规。如果您需要编写多个缓冲区,请自行组合或使用writev(2)
。