[python] 파이썬에서 멀티스레딩 시 발생하는 문제들

파이썬에서 멀티스레딩을 사용해 병렬 처리를 하려는 경우, 몇 가지 주의할 점이 있습니다. 멀티스레딩을 사용하면 성능을 최적화할 수 있지만, 이로 인해 발생하는 몇 가지 문제들을 유의해야 합니다.

1. 글로벌 인터프리터 락(Global Interpreter Lock, GIL)

파이썬은 GIL이라는 메커니즘을 통해 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 제한합니다. 이로 인해 멀티스레딩을 통해 CPU 바운드 작업을 수행할 때 병렬성의 이점을 얻을 수 없을 수 있습니다.

import threading

def count_up():
    global count
    for _ in range(1000000):
        count += 1

count = 0
thread1 = threading.Thread(target=count_up)
thread2 = threading.Thread(target=count_up)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(count)  # 예상 결과는 2000000이지만 GIL로 인해 실제 결과는 그렇지 않을 수 있음

2. 공유 자원 접근

여러 스레드가 공유 자원에 동시에 접근하는 경우, 경합 조건(race condition)이 발생할 수 있습니다. 이를 방지하기 위해 락(lock) 또는 세마포어(semaohore)와 같은 동기화 메커니즘을 사용하여 공유 자원에 대한 접근을 제어해야 합니다.

import threading

count = 0
lock = threading.Lock()

def count_up():
    global count
    for _ in range(1000000):
        with lock:
            count += 1

thread1 = threading.Thread(target=count_up)
thread2 = threading.Thread(target=count_up)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(count)  # 경합 조건 없이 안전하게 2000000이 출력될 것

3. 데드락(Deadlock)

멀티스레딩 환경에서 여러 스레드가 서로의 자원을 기다리며 무한 대기 상태에 빠지는 데드락이 발생할 수 있습니다. 이를 피하기 위해 모든 스레드에서 자원에 대한 접근 순서를 일관성 있게 유지해야 합니다.

이러한 문제들을 고려하고 적절한 동기화 메커니즘을 사용하여 멀티스레딩을 구현하면, 파이썬에서의 멀티스레딩을 효과적으로 활용할 수 있습니다.

참고 문헌: