2012-08-07 5 views
6

파이썬 스레드와 프로세스를 서로 관련이 없어도 이름이 지정된 잠금 (예 : 파일 잠금)과 동기화해야합니다. 리더기 잠금 장치 여야합니다. 나는 fcntl.flock (독점 및 공유 잠금 획득 모두)을 시도했지만 원하는 수준의 잠금을 제공하지 않습니다. - Does python's fcntl.flock function provide thread level locking of file access?파이썬 공유 및 독점 명명 된 잠금

내 솔루션 지금은 lockfile에 memcached (또는 mmap'ed locked 파일)를 사용합니다. Lockfile은 액세스를 동기화하고 memcached는 판독기/기록기를 계산합니다.

더 나은/더 빠른 해결책이 있습니까? 이미이 문제를 해결 한 프로젝트를 알고 있습니까?

+0

나는 모든 솔루션에도 관심이 있습니다. – cji

+0

[ilock] (https://github.com/symonsoft/ilock) 라이브러리 사용해보기 – Symon

답변

2

여기에는 posix 및 system V 세마포어를 구현하는 라이브러리가있는 http://semanchuk.com/philip/ 링크가 있습니다. 그 중 하나를 사용할 수 있습니다. 세마포어를 해제하지 않고 프로세스가 멈추는 상황에서는 다른 모든 프로세스가 멈추지 만주의해야합니다. 이 작업을 두려워하면 System V 세마포를 UNDO와 함께 사용할 수 있지만 조금 느립니다. 또한 System V 공유 메모리 프리미티브를 사용하는 경우 - 커널에 살고 프로세스 종료 후에도 계속 살아 있는지 기억하십시오. 시스템에서 명시 적으로 제거해야합니다. 당신이 관련 프로세스 및 전체 시스템 및 프로세스의 교착 상태를 죽음을 두려워하지 않는 경우

- (. 그들은 POSIX라는 이름의 세마포어입니다) 당신은 파이썬의 세마포어를 사용할 수

당신이 관련 질문 (은 fcntl)로 링크 된 페이지가 않습니다 fcntl이 스레드 간 잠금에 적합하지 않다고 말하는 것은 아닙니다. fcntl이 fds에 관심을 갖고 있다고 말합니다. 따라서 잠금 파일을 열고 각 잠금 인스턴스에 대해 새 fd를 얻는 한 프로세스 간 및 스레드 간 잠금에 fcntl을 사용할 수 있습니다.

인터 프로세스에 fcntl을 사용하고 스레드 간 잠금을 위해 파이썬의 세마포어를 사용할 수도 있습니다.

마지막으로 아키텍처를 다시 생각해보십시오. 잠금은 일반적으로 좋지 않습니다. 리소스를 잠금없이 처리하는 프로세스에 리소스를 위임합니다. 유지 보수가 훨씬 더 간단해질 것입니다. 나를 믿어.