我有一个脚本 1) 经常运行 2) 由很多不同的进程运行 3) 需要很长时间。
更新:需要很长时间的事情是测试谁的结果对于每个过程都是一样的。完全多余。
我认为是时候做一些缓存了,但我担心潜在的种族、冲突、腐败、时间漩涡不稳定和鸡。
复杂性来自于任何进程都可以更新缓存以及读取缓存,所以我必须知道如何处理所有这些组合。
在我看来,这似乎是比我更聪明、受过更多教育的人可能已经发现的东西。
无论如何,为了让这个问题更具体,这是我到目前为止的想法。我在脑海中使用 flock,不确定这是否是个好主意。
- 如果缓存是新的,读取它并离开
- 如果缓存过时
- 尝试获取写锁
- 如果我得到锁,进行测试并更新缓存
- 如果我没有获得锁,其他人是否有写锁或读锁?
- 如果它是共享的,为什么他们要读取陈旧的缓存?我是否忽略它们,进行测试并更新缓存(或者这可能导致它们读取写了一半的缓存……呃……)
- 如果是排他性的,给他们很短的时间来完成测试并更新缓存。
- 尝试获取写锁
希望这是有道理的...
最佳答案
这是一个使用 flock(2) 的方案用于并发环境中的文件锁定。 它解释了“safe-cache”的工作原理。
每个缓存文件都有两个伴随文件(WLock 和 RLock)。 除了第一个 (NB WLock),所有的 flock 请求都是阻塞的。
- 拥有 WLock 可确保有机会生成新的缓存
- 共享 RLock 确保从缓存文件中安全读取
- 并拥有独占 RLock 确保安全写入缓存文件
只有一个原因有两个伴随文件,那就是在生成新缓存时, 并且旧缓存不太旧(缓存时间+N未过期)客户端仍然可以使用旧缓存 而不是等待生成缓存。
请对这个方案进行评论,并尽可能使其更简单。
关于linux - 许多进程的缓存锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787567/