django ORM에서 경쟁 상태 (Race condition)에 대해 알아본다.
경쟁 상태 (Race condition)는 멀티스레드 환경에서 스레드가 공유자원에 접근할때, 순서에 따라 데이터를 잘못 가져와 결과값이 달라지는 현상을 말한다.
예를 들어서 글로벌 변수 count
가 있고, 각각의 스레드에서 count
의 값을 1씩 더한다고하자.
import threading
count = 0
def plus_count():
global count
for i in range(1000000):
count += 1
thread_1 = threading.Thread(target = plus_count)
thread_2 = threading.Thread(target = plus_count)
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
print(count)
1,000,000씩 2개의 스레드에서 더했으니 결과값은 2,000,000이 나와야 하지만 실제로 코드를 돌려보면 코드를 실행할때마다 매번 다른 숫자가 나오며 그 값들은 2,000,000보다 작다.
스레드 1에서 count
가 0일때 값을 가져와서 1을 더한다. 스레드 2에선 증가한 count
값인 1을 가져와서 1을 더해서 2로 만든다.
이론상으로는 문제가 없지만 실제로는 스레드 1과 스레드 2가 거의 동시에 count
에 접근했다고 생각해보자.
스레드 1에서 count=0
의 값을 가져와서 1로 늘리는 작업중에 스레드 2에서 count
값을 받아오면 그 값은 스레드 1에서 1을 더하기 전이므로 0일 것이다. 때문에 스레드 2에서도 count
값을 0에서 1로 늘리는 작업을 한다.
즉, 1을 더하는 작업을 두 번 진행했지만, 데이터를 잘못 가져와 한번 누락되어 0에서 2가 아닌 1이 되었다.
이러한 현상을 Race condition
이라고 한다.