GIL에 대해서 알아보자

King of Seoul·2022년 4월 3일
0
post-thumbnail
post-custom-banner

파이썬을 사용하다 보면 GIL과 마주하게 되는 상황이 온다.
멀티 쓰레딩을 하게 되면 오히려 실행 시간이 길어지는 경우가 있는데, 그 이유는 GIL 때문이다.

GIL이 무엇일까?

GIL은 Global Interpreter Lock으로 이름의 뜻으로만 본다면 인터프리터 전역에 수행하는 일종의 락임을 유추할 수 있다.
실제로 GIL은 여러 개의 쓰레드가 파이썬 코드를 병렬로 실행할 수 없도록 하는 역할을 한다.
그 말은 멀티 쓰레딩으로 코드를 작성해도 한 번에 하나의 쓰레드만 실행된다는 말이 된다.

그렇다면 GIL은 왜 있을까?

그 이유를 알기 전에 Reference Count에 대해 알고 있어야 한다.
파이썬에서는 모든 것이 객체로써 존재하는데, 그 객체들은 Reference Count를 가지고 있다. 파이썬의 가비지 컬렉터는 해당 객체의 Reference Count가 0이 되면 메모리에서 삭제하는 방식으로 동작한다.

이것이 GIL이 존재하는 이유다.

여러 쓰레드에서 동시에 인터프리터를 실행하면 Race Condition이 발생할 수 있다. Reference Count가 잘못 관리될 수 있고 이로 인해 가비지 컬렉터가 정상적으로 작동하지 않을 가능성이 생긴다.
Race Condition을 예방하기 위한 방법으로 Mutex가 있는데, 그렇게 되면 모든 객체에 Mutex를 적용해야 한다는 뜻이 된다.
이는 굉장히 비효율적인 방식이다.

그렇기 때문에 파이썬에서는 하나의 쓰레드가 인터프리터를 실행하고 있으면 다른 쓰레드는 실행할 수 없도록 인터프리터에 락을 건다.
이것이 바로 GIL이다.

병렬로 실행하려면 어떻게 해야 할까?

가장 간단한 방법은 멀티 프로세싱이다.
멀티 프로세싱은 멀티 쓰레딩과 다르게 프로세스간 자원을 공유하지 않는다.
각각의 프로세스가 독립된 메모리를 사용하기 때문에 Race Condition으로 인한 문제가 발생하지 않는다.
하지만 메모리를 많이 소모한다는 단점이 있다.

profile
"그는 천재야"
post-custom-banner

0개의 댓글