2009-09-22 43 views
5

當通過Passenger或Mongrel部署Rails時,您有多個應用程序正在運行。建立共享資源上的互斥鎖(如寫入本地文件或遠程文件)的最佳實踐或模式是什麼?我想確保兩個進程不會同時寫入同一資源。Mutex for Rails Processes

回答

14

如果您只是需要防止多個作者同時從一個文件時,您可以使用File#flock方法從每個進程請求獨佔寫鎖:

fh = File.new("/some/file/path") 
begin 
    fh.flock(File::LOCK_EX) 
    # ... write to the file here, or perform some other critical operation 
ensure 
    fh.flock(File::LOCK_UN) 
end 

注:將解鎖呼叫在ensure如果在鎖定文件後發生未捕獲的異常,則阻止死鎖非常重要。

+1

優秀的解釋。 – 2009-09-24 15:47:18

+1

我們如何檢查文件是否被鎖定?我想使用文件作爲全局鎖,#flock似乎對我很好,但另一個過程需要檢查它是否可用,我該如何解決? – 2014-05-19 23:01:03

+0

@HarisKrajina,如果'flock(File :: LOCK_EX | File :: LOCK_NB)'返回'false',則文件被鎖定。對於文檔,請參閱'ri File.flock'。 – 2015-01-30 08:24:52

2

據我所知,在這樣的環境中這樣做的唯一方法是使用基於文件的信號量 - 觸摸鎖定文件,完成您的工作,刪除鎖定文件。如果文件存在鎖定,則使進程失敗。

你也可以有一個服務,寫入線程文件,並使應用程序與服務對話來修改文件,而不是讓他們直接修改文件。