본문 바로가기

app/python

python은 GIL때문에 스레드가 효율적이지 않으면서 왜 multithreading 모듈이 있을까?

멀티스레딩

 

  • 하위 문제 중 하나의 다른 작업이 완료되는 동안 기다려야 하는 경우 싱글 스레드보다 멀티 스레딩이 좋다. (Ex : I/O 과중한 작업) 
  • The interpreter will reacquire this lock for every 100 bytecodes of Python instructions and around (potentially) blocking I/O operations.
  • 같은 프로세스 안에서 동작하므로 자원 공유가 가능 (queue, pickle 사용)

 

멀티 프로세스

 

 

파이썬에서 싱글 스레딩 vs 멀티 스레딩을 사용해야 하는 경우

I/o가 많은 작업에 대한 이점 == 멀티스레딩

만일 웹 url의 데이터를 가져와서 처리하는 로직이 있을 경우 다운로드에 대한 시간이 있으므로 단일 스레드 구현은 상당한 I/O 바인딩이 됩니다..  이때 각 다운로드 리소스에 새 스레드를 추가함으로써 다운로드 스레드, 처리 스레드를 통해 다운로드 동안의 I/O 블록을 피할 수 있습니다.. 

 

Cpu 연산이 많을 경우 == 싱글 스레딩

많은 재무 응용 프로그램처럼 숫자가 많이 사용되어 cpu 종속일 경우 GIL의 한계에 의해 멀티 스레딩의 이점이 없습니다. 

 

 

멀티 프로세싱을 해야 하는 경우 

  • GIL의 회피를 통해, 각 프로세스별 cpu코어를 활용해야 하는 경우
  • but 프로세서간 데이터 통신이 있다면 I/O 오버헤드 발생 (프로세스 간의 통신이 없는 경우가 베스트!!)
  • 데이터가 프로세스 위주의 연산이라면 속도 향상 가능 (각각의 프로세스가 나눠서 계산하기 때문에)