同步进程间访问以更新公共文件
Synchronizing Inter-process access for Updating a common file
我有两个脚本正在更新同一个文件。两者可以同时运行。如何防止文件更新不一致?换句话说,如何序列化对文件的访问?
让我解释一下这个问题。假设有一个 shelf 文件并且有 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()
假设脚本 2 安排在脚本 1 打开文件之后。当脚本 2 完成并将 returns 控制给脚本 1 时,脚本 1 将进行更新并关闭文件。这将导致脚本 2 的更新丢失。如何防止这种情况发生,以便对文件进行两次更新?
您可以使用粗锁来确保在任何给定时间只允许一个客户端访问该文件。
由于您处于不同的进程中,因此您需要某种可以从所有协作者处读取的共享资源。
Redis 提供了一些使这更容易的原语(锁上的 TTL),并且由于它是单线程的,因此有助于推断对它的并发访问:
我有两个脚本正在更新同一个文件。两者可以同时运行。如何防止文件更新不一致?换句话说,如何序列化对文件的访问?
让我解释一下这个问题。假设有一个 shelf 文件并且有 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()
假设脚本 2 安排在脚本 1 打开文件之后。当脚本 2 完成并将 returns 控制给脚本 1 时,脚本 1 将进行更新并关闭文件。这将导致脚本 2 的更新丢失。如何防止这种情况发生,以便对文件进行两次更新?
您可以使用粗锁来确保在任何给定时间只允许一个客户端访问该文件。
由于您处于不同的进程中,因此您需要某种可以从所有协作者处读取的共享资源。
Redis 提供了一些使这更容易的原语(锁上的 TTL),并且由于它是单线程的,因此有助于推断对它的并发访问: