개발/python

파이썬 GIL(Global Interpreter Lock) 이해하기: 병렬처리에 관한 성능 제한과 해결

심집사 2023. 7. 8. 21:14

 

 

 

멀티스레딩을 활용할 때 파이썬의 Global Interpreter Lock(GIL)이라는 특징에 자주 부딪힙니다. 이번 글에서는 GIL에 대한 이해와 이로 인한 병렬 처리 성능 제한 문제 및 해결 방법을 알아보겠습니다.

 

파이썬 GIL(global interpreter lock) 이란?

  • 파이썬 GIL은 CPython 인터프리터에서 스레드가 동시에 실행되지 않도록 제어하는 메커니즘이자 잠금 기능입니다. GIL은 동시에 실행되는 스레드가 공유 리소스에 접근할 때 발생하는 동기화 문제를 방지하기 위해 도입되었습니다. 그러나 이로 인해 하나의 프로세스 내에서 여러 스레드를 실행하더라도 한 번에 하나의 스레드만 실행되어 CPU 바인드 작업에 병목 현상이 발생할 수 있습니다.

GIL(global interpreter lock)의 영향

  • 파이썬의 GIL 때문에 멀티스레딩을 사용해도 예상한 만큼의 성능 향상을 얻지 못하는 경우가 있습니다. I/O 바운드 작업에서는 GIL 해제와 스위칭이 자주 일어나며 멀티스레딩이 도움이 되지만, CPU 바운드 작업에서는 GIL 때문에 성능 저하가 발생할 수 있습니다.

GIL(global interpreter lock) 해결 방법

  • GIL의 영향을 줄이기 위해 멀티프로세싱(multiprocessing)을 사용할 수 있습니다. 멀티프로세싱 모듈은 각 프로세스가 독립된 메모리 영역을 가지며, GIL의 제약을 피할 수 있습니다. 이를 통해 병렬 처리를 수행하면 성능이 향상됩니다.

 

예제 :

python
from multiprocessing import Pool, Process

# 병렬 처리할 작업(함수)
def work_function(x):
    return x * x

if __name__ == "__main__":
    with Pool() as p:
        print(p.map(work_function, range(5)))

 

결론

  • 파이썬의 GIL로 인해 멀티스레딩을 활용한 성능 향상이 제약되는 경우가 있습니다. 그러나 멀티프로세싱을 사용함으로써 GIL의 영향을 줄이고 병렬 처리를 구현하여 성능을 향상시킬 수 있습니다.