파이썬의 멀티 스레드와 파이썬이 느린 이유

minisoo·2023년 11월 29일
0

나중에 정리해야지(?)라는 생각으로 적어놨던 키워드들을 글또에 참여하게 되면서 꺼내게 되었다 😳

파이썬의 멀티 스레드?

우리가 일반적으로 사용하는 CPython은 한 프로세스당 하나의 인터프리터만 존재한다

여러 스레드가 인터프리터를 사용하기 위해 경쟁하는 상황을 방지하기 위해 GIL을 도입하여 현재 어떤 스레드가 인터프리터를 사용하고 있는지 관리하게 된다

GIL을 통해서 실행 중인 스레드를 제외한 다른 모든 스레드들은 대기하게 된다.
스레드가 아무리 늘어나도 단일 인터프리터로 실행되기 때문에 결국 스레드는 의미가 없게된다

GIL (Global Interpreter Lock)

하나의 스레드만 파이썬 인터프리터를 제어할 수 있도록 하는 뮤택스

  • 뮤택스는 스레드들의 실행시간이 서로 겹치지 않고 각각 단독으로 실행되도록 하는 기술
    화장실이 하나 뿐이 없는 식당에 비유할 수 있는데, 해당 화장실 키를 가진 사람이 화장실을 이용할 수 있고, 이용하고자 하는사람은 대기해야한다

멀티 스레드는 여러 개의 스레드가 여러 코어 상에서 병렬로 실행될 수 있다는 것인데, python에서는 그러한 병렬 실행이 불가능하다

GIL을 사용하는 이유

Python에서는 모든 것이 객체(Object)로 각 객체는 참조 카운트 변수를 가지고 있다
python에서 GC는 참조 카운트 변수가 0이 되면 객체가 점유한 메모리가 가비지 컬렉터에 의해 해제된다

이러한 파이썬의 특성상, 멀티 스레드 환경에서 두 스레드가 동시에 참조 카운트 변수값을 늘리거나 줄이는 race condition이 발생할 수 있게 된다

Race condition이 발생하게 되면, 객체의 참조 횟수가 올바르게 관리되지 못하고 메모리 누수가 발생하거나 객체에 대한 참조가 남아있는 데도 메모리를 잘못 해제할 수 있다

따라서 GIL은 메모리 안정성을 보장하기 위한 선택이라고 볼 수 있다

싱글, 멀티스레드 속도 비교


7.4초 소요

7.6초 소요

오히려 멀티스레드가 더 오래걸린다 ..?

무조건 싱글스레드?

Python에서는 외부 연산(I/O, Sleep 등)을 하느라 CPU가 아무것도 하지 않고 기다리기만 할 때는 다른 쓰레드로의 문맥 전환을 시도하게 되어 있다
이때는 다른 쓰레드가 실행되어도 공유 자원의 Race Condition 문제가 발생하지 않기 때문이다

이러한 이유로, CPU bound한 프로그램에서는 오히려 병목을 만들 수 있지만, I/O bound한 프로그램에서는 멀티 쓰레딩이 굉장히 좋은 성능을 보인다

CPU Bound, I/O Bound

  • CPU Bound
    CPU 연산량이 많은 작업으로 예를들어 머신러닝, 고속 연산등을 말한다
  • I/O Bound
    I/O wating 시간이 많은 작업으로 주로 파일쓰기, 디스크 작업등을 말한다

파이썬이 느린이유

파이썬이 느린이유는 대표적으로 3가지 이유가 있다

파이썬은 모든 것이 객체

파이썬에는 원시 타입이 없고, 전부 참조 타입으로 변수들이 참조하는 데이터는 모두 pyObject라는 객체 형식으로 이루어져 있다

파이썬에서 사용하는 객체 참조 방식은 해당 변수가 가리키는 객체의 PyObject_HEAD를 확인해서 데이터 타입 정보를 가지고 있는 typecode를 확인하고 거기에 해당되는 C의 자료형을 확인하는 일련의 작업이 필요하다고 한다

동적으로 변수를 할당하는 과정에서 많은 연산이 필수적으로 수반되므로 속도가 느려지게 된다

인터프리터 언어

컴파일 단계에서 데이터의 자료형에 대한 정보를 알고있는 정적 타이핑 컴파일 언어와는 다르게 객체의 PyObject_HEAD에 typecode를 설정하고 읽어오는 작업이 모두 실행 시간에 이루어지기 때문에 느려지게 된다

GIL

앞서 정리했던 내용대로 GIL로 인해 멀티스레드가 제한된다

GIL에 대해 공부하다가 흥미로운(?) 기사들를 발견했다
파이썬에서 GIL이 삭제된다는 기사였다..!

정말 많은 사람들이 기다려왔던 소식인 것 같다...😳
파이썬이 앞으로 더 발전하기를 응원한다(?)


[참고자료]

Python GIL이란
GIL 이해하기
뮤택스
Python은 왜이렇게 느린걸까?
파이썬의 속도가 느리다는 말의 의미

profile
코딩하는 돌멩이 👻

1개의 댓글

comment-user-thumbnail
2023년 12월 17일

GIL 삭제 소식이 있었군요...?! 흥미롭네요!😏 더더욱 파이썬을 해야겠습니다!ㅋㅋ

답글 달기