오늘도 개발
Global Interpreter Lock(GIL) 본문
1. GIL이란?
한 번에 한 스레드만 Python Interpreter(Cpython)에 접근할 수 있게 해주는 장치.
Mutex의 일종이다.
(파이썬 프로그램의 스레드는 Interpreter에 들어갈 때 자물쇠를 들고 들어가서 문을 잠근다.
다른 스레드는 안에 있는 스레드가 나와서 자물쇠를 반납하기 전까지 Interpreter에 접근할 수 없다.)
GIL은 Cpython에서만 사용된다.
2. 파이썬이 GIL을 도입한 이유
reference counting
파이썬은 메모리 관리에 reference counting 방법을 사용한다.
메모리 관리자가 오브젝트를 참조하는 변수의 개수를 세고 있다가
아무 변수도 오브젝트를 참조하지 않으면 메모리에서 버린다는 뜻이다.
>>> import sys
>>> x = []
>>> y = x
>>> sys.getrefcount(x) # x 오브젝트가 몇 번 참조되었는지 확인하는 명령
3 # x, y, getrefcount에 의해 3번 참조되었으므로 3
reference counting과 멀티스레딩
reference counting 방식은 멀티스레딩 시 문제가 될 수 있다. (= thread-safe하지 않다.)
여러 스레드가 공유하는 오브젝트에 여러 스레드가 동시에 접근한다면 race condition이 일어날 수 있기 때문이다.
이 경우 필요한 오브젝트의 reference count가 0으로 잘못 집계되어 메모리에서 사라져버릴 수도 있고
필요 없는 오브젝트의 count가 0이 되지 않아 memory leak가 발생할 수도 있다.
GIL의 필요성
이런 문제를 막으려면 여러 스레드가 공유하는 오브젝트마다 자물쇠(lock)를 걸어야 했다.
자물쇠가 여러 개 생기면 데드락 문제가 발생할 수 있었다.

또 오브젝트마다 자물쇠를 열고 닫느라 성능이 저하될 것이다.
GIL은 인터프리터에만 자물쇠를 딱 한 개 거는 방식이다.
GIL이 있는 스레드만 인터프리터에서 bytecode를 실행할 수 있다.
자물쇠가 하나이기 때문에 데드락이 발생하지 않고, 성능 저하도 심하지 않다.
3. GIL과 멀티스레딩
파이썬에는 GIL이 있기 때문에 작업의 종류에 따라 멀티스레딩을 적절히 사용해주어야 한다.
1) CPU bound 작업
멀티스레드로 하면 오히려 성능이 떨어진다.
GIL이 병렬 실행을 막기 때문에 여러 스레드를 번갈아가며 왔다갔다 작업해야 하는데
이 때 Context Switching 비용이 더 들기 때문이다.
2) I/O bound 작업
멀티스레드 사용 시 성능이 좋아질 가능성이 크다.
i/o bound 작업 시 GIL이 자동으로 해제될 가능성이 크기 때문이다.
파이썬은 native 코드(OS가 직접 컴파일하는 코드, C/C++로 작성된 코드) 실행 시 GIL을 자동으로 해제하는데
i/o bound 작업에 필요한 라이브러리는 보통 native 코드로 작성되기 때문이다.
왜 파이썬은 i/o bound 작업에는 GIL을 해제할까?
GIL은 CPU가 공유하는 자원에 대한 문제 때문에 필요하기 때문이다.
CPU 연산 비중이 적은 I/O bound 작업에서는 공유 자원의 Race Condition 문제가 발생할 확률이 적으므로
굳이 GIL을 걸 필요가 없다.
4. GIL 우회 방법
1) 멀티 스레딩이 아니라 멀티 프로세싱 방식을 사용
2) GIL은 Cpython에서만 사용하는 방식이므로 다른 언어로 작성된 인터프리터를 사용
참조
'웹 프로그래밍 > Python3' 카테고리의 다른 글
| setdefault와 defaultdict (0) | 2022.12.23 |
|---|---|
| Python의 GC(Garbage Collection) (0) | 2022.10.31 |
| Asyncio와 비동기 작업 4) multithreading과 run_in_executor 메서드 (0) | 2022.08.30 |
| Asyncio와 비동기 작업 3) async with, async for (0) | 2022.08.30 |
| Asyncio와 비동기 작업 2) Awaitables(Coroutine, Task, Future) (0) | 2022.08.24 |