여러 스레드·프로세스가 같은 데이터를 동시 수정하면 「데이터 경쟁」이 발생합니다.
counter = counter + 1처럼 단순한 코드도 멀티스레드에서 결과가 꼬일 수 있음.
동기화 도구가 필요합니다.
Lock(뮤텍스).
lock = threading.Lock().
with lock: counter += 1.
한 시점에 하나의 스레드만 with 블록 안에 들어감.
가장 단순하고 일반적.
RLock(재진입 가능).
같은 스레드가 같은 락을 여러 번 획득해도 됨.
재귀 함수나 같은 메서드 안에서 다른 메서드 호출이 락을 다시 잡을 때 데드락 방지.
Semaphore — N개 동시 허용.
sem = Semaphore(5).
with sem: ...
— 동시에 최대 5개 스레드만.
DB 연결 풀, 동시 다운로드 수 제한 같은 「자원 제한」에.
데드락 — 가장 무서운 버그.
「스레드 A가 락 1 잡고 락 2 기다리는데, 스레드 B가 락 2 잡고 락 1 기다리는」 상황.
영원히 멈춤.
예방 — 락 획득 순서 일관, 타임아웃 사용, 락 개수 최소화.
가능한 한 큐·async로 락 자체를 피하는 게 가장 안전.
한 줄 요약
Lock은 한 스레드만 입장, RLock은 재귀, Semaphore는 N개 동시.
데드락은 가장 무서운 버그 — 순서 일관·타임아웃·락 최소화.
큐·async로 우회가 가장 안전.
더 알아볼 것
- Condition·Event — 신호 기반 동기화
- ReaderWriterLock — 읽기 다수, 쓰기 단독
- 락 없이 — 불변 자료구조