2012-08-03 39 views
1

我有一個腳本,1)經常運行2)由許多不同的進程運行,3)需要很長時間。緩存鎖定了很多進程?

更新:需要很長時間的東西是測試誰的結果將在每個進程相同。完全多餘。

我認爲是時候做一些緩存,但我擔心種族,衝突,腐敗,時空渦不穩定和雞的潛力。

因爲任何進程都可以更新緩存以及讀取緩存,所以我必須知道如何處理所有這些組合。

這讓我覺得有點像某人比我更聰明,受過更多教育的東西已經可能想到了。

無論如何,爲了使這個問題更加具體,這是我迄今爲止想到的。我在腦海中使用羊羣,不知道這是個好主意。

  • 如果緩存是新鮮的,閱讀並走開
  • 如果緩存過期
    • 試圖得到一個寫鎖
      • ,如果我得到的鎖,執行測試和更新緩存
      • 如果我沒有獲得鎖定,其他人是否有寫入鎖定或讀取鎖定?
      • 如果它共享,他們爲什麼要讀一個陳舊的緩存?我是否忽略它們,進行測試並更新緩存(或者這可能導致它們讀取半寫入緩存......呃......)
      • 如果它是獨佔的,給它們一小段時間以完成測試並且更新緩存。

希望是有道理的......

回答

1

下面是使用flock(2)在併發環境文件鎖定的方案。 它解釋了「safe-cache」是如何工作的。

每個緩存文件都有兩個伴隨文件(WLock和RLock)。 除了第一個請求之外,所有的flock請求都被阻塞(NB WLock)。

  • 有WLock確保了可能產生新的緩存
  • 的機會有共享RLOCK確保從緩存中的文件安全讀
  • ,並具有獨特的RLOCK確保安全寫入緩存文件

有兩種伴隨文件只有一個原因,那就是當生成新緩存時, 和舊緩存不會過時(緩存時間+ N未過期),客戶端仍然可以使用舊緩存 而不是等待緩存正在生成。

請對此方案發表評論,並儘可能簡化。

cache locking diagram

+0

嘿,我忘了我發佈了這個問題,剛纔又跑過去了。感謝您的答案和漂亮的圖表。 +1 – pileofrogs 2015-10-30 17:08:31