[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)
멀티스레딩 환경에서 여러 스레드가 서로의 자원을 기다리며 무한 대기 상태에 빠지는 데드락이 발생할 수 있습니다. 이를 피하기 위해 모든 스레드에서 자원에 대한 접근 순서를 일관성 있게 유지해야 합니다.
이러한 문제들을 고려하고 적절한 동기화 메커니즘을 사용하여 멀티스레딩을 구현하면, 파이썬에서의 멀티스레딩을 효과적으로 활용할 수 있습니다.
참고 문헌:
- https://realpython.com/intro-to-python-threading/
- https://docs.python.org/3/library/threading.html