파이썬의 GIL
파이썬은 기본적으로 자바와 같이 가비지컬렉터에 의해 메모리가 관리된다.
여기서 파이썬은
- 순환 참조
- Reference count
를 이용해 메모리를 관리한다.
>>> import sys
>>> a = []
>>> b = a
>>> sys.getrefcount(a)
3
Reference count의 값이 0이 되면 더이상 참조되지 않음으로 판단하고
해당 객체는 메모리에서 해제된다.
여기서 만약 멀티스레드 환경이 된다면?
해당 Ref.count 값은 임계영역에 존재하게 되며 이를 동기화하지 않으면 사용하는 객체까지 해제될 수 있다.
그렇기에 파이썬은 GIL을 사용한다.
인터프리터의 자체적인 Lock을 획득해야하만 바이트 코드를 실행할 수 있기 때문에
자체적으로 싱글스레드 환경으로 만들어버린다.
해결책은?
- I/O-bound가 큰 상황에서만 멀티 스레드를 활용
- 아니면 멀티프로세싱을 이용
- 그냥 파이썬답게 싱글스레드 쓰자
반응형
'공부' 카테고리의 다른 글
REST API (0) | 2020.05.28 |
---|---|
HTTP와 HTTPS (0) | 2020.05.28 |
기술 면접 준비 - 자바 (0) | 2020.05.27 |
끝이 안보이는 기사 공부 (0) | 2020.05.13 |
마크다운과 Notion 적응기 (0) | 2020.04.29 |
댓글