當通過Passenger或Mongrel部署Rails時,您有多個應用程序正在運行。建立共享資源上的互斥鎖(如寫入本地文件或遠程文件)的最佳實踐或模式是什麼?我想確保兩個進程不會同時寫入同一資源。Mutex for Rails Processes
5
A
回答
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
如果在鎖定文件後發生未捕獲的異常,則阻止死鎖非常重要。
2
據我所知,在這樣的環境中這樣做的唯一方法是使用基於文件的信號量 - 觸摸鎖定文件,完成您的工作,刪除鎖定文件。如果文件存在鎖定,則使進程失敗。
你也可以有一個服務,寫入線程文件,並使應用程序與服務對話來修改文件,而不是讓他們直接修改文件。
1
您可以使用後臺作業計劃程序來完成實際工作,例如delayed_job(http://github.com/tobi/delayed_job)。
相關問題
- 1. Nginx + Passenger + Rails 3 Rack processes hang
- 2. namedpipe pingpong syncronizate processes
- 3. mysql show processes
- 4. get processes icon mfc C++
- 5. 'MySQL server has gone away'with longlasting processes
- 6. VC++ Mutex問題
- 7. 遞歸鎖(Mutex)與非遞歸鎖(Mutex)
- 8. boost :: mutex ::〜mutex():聲明`!pthread_mutex_destroy(&m)'失敗
- 9. Pthread Mutex Segfault
- 10. .Net Mutex問題
- 11. Android NDK Mutex
- 12. Pthread Mutex鎖定
- 13. Boost :: Mutex&Malloc
- 14. Mutex是rabbitmq
- 15. Mutex類構件
- 16. Mutex vs布爾
- 17. Mutex不同步C++
- 18. Mutex和Windows Phone 8.1
- 19. 什麼更好std :: lock_guard <std::mutex>鎖(std :: mutex mutex_var);或std :: mutex mutex_var.lock();
- 20. 爲什麼boost :: mutex比vs2013的std :: mutex更快?
- 21. 這是否適用於while(true){// Processes}?
- 22. 實時捕獲python-background-processes輸出
- 23. product.number for user_id rails
- 24. Netbeans Intellisense for Rails
- 25. MongoDB for Rails
- 26. Rails 406 for .js.erb
- 27. CONCAT_WS for Rails?
- 28. HAML Form For Rails
- 29. Rails PhantomJS for scraping
- 30. mobile_fu for Rails 4
優秀的解釋。 – 2009-09-24 15:47:18
我們如何檢查文件是否被鎖定?我想使用文件作爲全局鎖,#flock似乎對我很好,但另一個過程需要檢查它是否可用,我該如何解決? – 2014-05-19 23:01:03
@HarisKrajina,如果'flock(File :: LOCK_EX | File :: LOCK_NB)'返回'false',則文件被鎖定。對於文檔,請參閱'ri File.flock'。 – 2015-01-30 08:24:52