我有两个更新同一文件的脚本。两者都可以同时运行。如何防止对文件进行不一致的更新?换句话说,如何序列化对文件的访问?
让我解释一下这个问题。假设有一个架子文件,并且有2个脚本正在更新它。脚本1执行此操作:
import shelve
sf = shelve.open('some_file')
sf[key1] = data1
sf.close()
脚本2具有以下代码:
import shelve
sf = shelve.open('some_file')
sf[key2] = data2
sf.close()
假设在脚本1打开文件后安排脚本2。当脚本2完成并且控制返回到脚本1时,脚本1将执行其更新并关闭该文件。这将导致脚本2的更新丢失。如何防止这种情况发生,以便对文件进行两次更新?
答案 0 :(得分:1)
您可以使用粗锁来确保在任何给定时间只允许单个客户端访问该文件。
由于您处于不同的流程中,因此您需要某种可从所有协作者处读取的共享资源。
Redis提供了一些原语,使这更容易(锁定上的TTL),并且因为它是单线程有助于推断对它的并发访问: