나는 주문형 미러링을 수행하는 간단한 서버를 가지고 있습니다. 가져 오기는 비용이 많이 듭니다 (네트워크 대기 시간, 무결성 검사, (재) 압축 등). 따라서 URL 당 하나의 잠금을 가져오고 싶습니다. 즉,Python 3 - 문자열에 의한 색인 잠금에 의한 경쟁 조건
- 하나의 스레드 만 하나의 파일을 가져옵니다.
- 다른 스레드가 현재 페치중인 파일 중 하나를 원하면 파일 준비가 완료 될 때까지 차단됩니다.
내가 처음처럼 뭔가를하고의 생각 :
# Globals
fetching = dict()
fetch_lock = threading.Lock()
...
lock = None
do_fetch = False
with fetch_lock:
if url in fetching:
lock = fetching[url]
else:
lock = threading.Lock()
fetching[url] = lock
do_fetch = True
# Race condition
lock.acquire()
if do_fetch:
...
with fetch_lock:
lock.release()
if do_fetch:
del fetching[url]
# Serve file
...
경쟁 조건이 (스레드가 캐시에 아직없는 파일에 액세스하려고 할 수 있습니다) 오히려 사소한,하지만 내가 할 수있는 ' 그것을 해결할 방법을 찾지 못한다.
'do_fetch'가 True 인 쓰레드가'lock.acquire()'의 첫 번째 문제가 아닐 수 있습니까? –
정확합니다. --------- – moatPylon
'fetch_lock'을 풀기 전에'lock.acquire()'를 할 수 있습니까? 그러면'lock '을 생성하는 스레드가 먼저 그것을 획득해야합니다. –