如何构建一个原子文件写操作?这个文件将由一个Java服务写入,被Python脚本读取。
需要说明的是,读取的次数要远大于写入。但是写入会批量进行且通常会很长。文件大小为兆字节。
目前我的方法是:
- 将文件内容写入同一目录下的临时文件中
- 删除旧文件
- 将临时文件重命名为旧文件名
这种方法正确吗?如何避免旧文件被删除但新文件名尚未重命名的情况?
这些编程语言(Python 和 Java)是否提供锁定机制以避免这种情况?
如何构建一个原子文件写操作?这个文件将由一个Java服务写入,被Python脚本读取。
需要说明的是,读取的次数要远大于写入。但是写入会批量进行且通常会很长。文件大小为兆字节。
目前我的方法是:
这种方法正确吗?如何避免旧文件被删除但新文件名尚未重命名的情况?
这些编程语言(Python 和 Java)是否提供锁定机制以避免这种情况?
至少在 POSIX 平台上,省略第三步(删除旧文件)。在 POSIX 中,文件系统内的重命名操作保证是原子性的,将一个文件重命名到已存在的文件名时会原子性地替换它。
这是一个典型的生产者/消费者问题。您可以通过使用文件重命名来解决此问题,在POSIX系统上具有原子性。
rename
()或mv
即可。文件需要在同一文件系统上。LockFileEx
。对于读取,打开锁文件上的共享锁
。对于写入,打开锁文件上的独占锁
。在Windows中,锁定是奇怪的,因此我建议为此使用单独的锁定文件。在Python脚本中,让它们向服务请求权限。当服务正在写入时,会对文件进行锁定。如果存在锁定,则服务会拒绝Python的请求。