缓存锁定许多进程?

时间:2012-08-03 00:08:18

标签: linux caching locking flock

我有一个脚本1)经常运行2)由许多不同的流程运行3)需要很长时间。

更新:需要很长时间的事情是测试每个进程的结果是否相同。完全是多余的。

我认为是时候进行一些缓存,但我担心种族,冲突,腐败,时间涡旋不稳定和鸡的可能性。

复杂性来自于任何进程都可以更新缓存以及读取缓存,因此我必须知道如何处理所有这些组合。

这让我闻起来像是一个比我自己更聪明,更有教养的人已经想到的东西。

无论如何,为了使这个问题更具体,这是我到目前为止所想到的。我正在使用羊群,不知道这是不是一个好主意。

  • 如果缓存是新鲜的,请阅读并离开
  • 如果缓存是陈旧的
    • 尝试获取写锁定
      • 如果我获得锁定,请执行测试并更新缓存
      • 如果我没有获得锁定,其他人是否有写入或读取锁定?
      • 如果共享,他们为什么要阅读过时的缓存?我是否忽略它们,进行测试并更新缓存(或者这可能导致它们读取半写缓存...呃...)
      • 如果它是独占的,请给他们一个短时间来完成测试并更新缓存。

希望有道理......

1 个答案:

答案 0 :(得分:1)

这是一个在并发环境中使用flock(2)进行文件锁定的方案。 它解释了“safe-cache”的工作原理。

每个缓存文件都有两个配套文件(WLock和RLock)。 除第一个(NB WLock)外,所有flock请求都被阻塞。

  • 让WLock确保可能生成新缓存的机会
  • 拥有共享RLock可确保从缓存文件中安全读取
  • 并拥有独有的RLock可确保安全写入缓存文件

有两个伴随文件只有一个原因,那就是生成新缓存时, 和旧缓存不太旧(缓存时间+ N未过期)客户端仍然可以使用旧缓存 而不是等待生成缓存。

请评论此计划,并尽可能简化。

cache locking diagram