Twisted API for DeferredFilesystemLock에는 deferUntilLocked
이 동시 사용에는 안전하지 않다고 나와 있습니다.왜 Twisted의 DeferredFilesystemLocks는 동시 사용에 안전하지 않습니까?
내가 파일 잠금을 오용하지 않도록하기 위해 안전하지 않은 방법과 안전하지 않은 방법을 이해하고 싶습니다.
Twisted API for DeferredFilesystemLock에는 deferUntilLocked
이 동시 사용에는 안전하지 않다고 나와 있습니다.왜 Twisted의 DeferredFilesystemLocks는 동시 사용에 안전하지 않습니까?
내가 파일 잠금을 오용하지 않도록하기 위해 안전하지 않은 방법과 안전하지 않은 방법을 이해하고 싶습니다.
아마이 방법은 사실상 동시 사용에는 상당히 안전합니다. the first four lines of the implementation을 읽으면 동시 사용을 시도하면 즉시 AlreadyTryingToLockError
이 발생합니다.
아마도이 경고는 유용한 잠금 동작 대신 예외가 발생한다고 경고하기위한 것입니다.
예외 구현은 동시 사용이 허용되지 않는 이유에 대한 힌트를 제공해야합니다. DeferredFilesystemLock
은 잠금을 확보하려는 시도의 진행 상황을 추적하기 위해 _tryLockCall
으로 시작하는 일부 인스턴스 속성을 사용합니다. 동시 시도가 허용되면, 그들은 각각이 속성 (및 다른 것들)의 사용을 서로 트림합니다.
비교적 쉽게 향상시킬 수 있습니다. 필요한 것은 잠금 시도와 연결된 상태를 시도 (DeferredFilesystemLock
인스턴스 대신)마다 할당 된 새 개체에 유지하는 것입니다. Or, DeferredLock
could help.
마음에 가장 먼저 떠오르는 것은 동시 상황에서 잠금을 확보하지 못했다는 것입니다 (다른 스레드가 잠금을 해제하지 않은 경우). 그러면 defer
수 있습니다. 선택 사항 인 timeout
을 deferUntilLocked
에 전달하면이 문제를 피할 수 있습니다. 그들이 공정한 대우, 또는 하나 개의 스레드가 더 이상 지출 - 여러 스레드가 계속 같은 락의 취득을 대기하는 경우 무엇 :
기아 :
다른 일들은 동시 사용이 적합 할 수 있습니다 고려 다른 사람들보다 기다리고 있니? 스레드가 결국 잠금을 획득하도록 보장됩니까?
교착 상태 : 한 번에 여러 개의 잠금을 획득하고 여러 스레드가이 작업을 수행하는 경우 두 스레드가 다른 스레드에서 보유하고있는 리소스를 기다리는 상황이 발생할 수 있습니다.
획득 한 잠금이 항상 해제되어 있습니까? 한 스레드가 잠금을 획득하고 해제하지 않고 충돌하는 경우 어떻게해야합니까?
트위스트의 구현이 상당히 단순하고 아마도 이러한 것들을 고려하지 않은 것처럼 보입니다. 그들의 "안전하지 않은"의견은 "여기에 용이 있습니다"입니다 - 동시 응용 프로그램에서 이것을 사용하려고 시도하면 동시 버그 또는 문제를 해결하기 어려울 수도 있습니다.
모든 (단 하나 제외) 트위스트 된 API는 * 명시 적으로 * 스레드로부터 안전하지는 않습니다. "what if two threads ..."시나리오는 두 개의 스레드에서 API를 사용할 수 없다는 암묵적인 경고 메시지가 아닙니다. –