2009-09-22 3 views
5

Passenger 또는 Mongrel을 통해 레일을 배치 할 때 응용 프로그램의 여러 인스턴스가 실행 중입니다. 로컬 파일이나 원격 파일에 쓰기와 같은 공유 리소스에 뮤텍스를 설정하는 가장 좋은 방법 또는 패턴은 무엇입니까? 두 프로세스가 같은 리소스에 동시에 쓰지 않도록하고 싶습니다.Mutex for Rails 프로세스

답변

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

우수 설명. –

+1

파일이 잠겨 있는지 확인하려면 어떻게합니까? 전역 잠금으로 파일을 사용하고 싶습니다. #flock은 나에게 잘 보이지만 다른 프로세스가 사용 가능한지 확인해야합니다. 어떻게 해결합니까? –

+0

@HarisKrajina,'flock (File :: LOCK_EX | File :: LOCK_NB)'이'false'를 반환하면 파일이 잠 깁니다. 문서의 경우,'ri File.flock'을 참조하십시오. –

2

아는 한, 이와 같은 환경에서 이것을 수행하는 유일한 방법은 파일 기반 세마포어를 사용하는 것입니다. 잠금 파일을 터치하고, 작업하고, 잠금 파일을 제거하십시오. 파일에 잠금이있는 경우 프로세스가 실패하게하십시오.

또한 스레드 된 파일에 쓰기 서비스를 사용하여 파일을 직접 수정할 수 없도록 파일을 수정하기 위해 서비스와 대화하게 할 수 있습니다.

1

백그라운드 작업 스케줄러를 사용하여 실제 작업을 수행 할 수 있습니다 (예 : delayed_job (http://github.com/tobi/delayed_job)). 방금 동시에 파일 작업에서 여러 작가를 방지해야하는 경우