[Programming] Python's GIL
Python GIL
Python์ GIL
- Global Interpreter Lock
- ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ํ์ด์ฌ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํ๋ฒ์ ํ๋๋ง ์ฌ์ฉํ ์ ์๊ฒ ๋ฝ์ ๊ฑฐ๋ ๊ฒ
- ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ ์์ค๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ํด์ํด์ ์คํ
- ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ์คํ ์ค์ผ์ง๋ผ๋ GIL์ ๊ฐ ์ฐ๋ ๋๊ฐ ์์ฐจ์ ์ผ๋ก๋ง ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๊ฒ ํจ
- ์ฆ, ํ๋์ ์ฐ๋ ๋๋ง ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ ๋ฎคํ ์ค
- ๋ฉํฐ ์ฐ๋ ๋ ํ๋ก๊ทธ๋จ์์ ๋ฉํฐ ์ฐ๋ ๋๊ฐ ์ฑ๊ธ ์ฐ๋ ๋์ฒ๋ผ ๋์ํด ๋ณ๋ชฉ์ ์ ๋ฐํจ
GIL์ ์ค๊ณ ์๋
์ด๊ธฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์
- ํ์ด์ฌ ๊ตฌํ์ฒด์ธ CPython์ ์ฐธ์กฐ ์นด์ดํ
(Reference Counting)์ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌ
- ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ๋๋ง๋ค ์ฐธ์กฐ ํ์๋ฅผ ๊ธฐ๋กํ๊ณ , ์ฐธ์กฐ๊ฐ 0์ด ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ํด๋น ๊ฐ์ฒด๋ฅผ ํด์ ํ๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋งค์ปค๋์ฆ
- ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ๋์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ํด์ ํ ๋, ์ฐธ์กฐ ์นด์ดํธ ๊ฐ์ ์ ํํ๊ฒ ์ ์งํ๊ธฐ ์ํด์๋ ๋๊ธฐํ๊ฐ ํ์ํจ
- ๋ค์์ ์ฐ๋ ๋๊ฐ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ์ฐธ์กฐ ํด์ ์์ ์ ๋์์ ์ํํ๋ค๋ฉด ๋ฐ์ดํฐ ๊ฒฝ์(Race Condition)์ด ๋ฐ์ํ ์ ์์ด ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ด๊ทธ๋ฌ์ง๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์๊ธฐ์น ์์ ๋์์ ์ด๋ํ ์ ์์
Multi-threading๊ณผ์ ์ถฉ๋ ํด๊ฒฐ
- ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ง์ํ๊ธฐ ์ํด์๋ ๊ฐ ์ฐ๋ ๋๊ฐ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์์ด์ผ ํจ
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ฐํ ์ ๊ธ(Fine-grained Locking)์ ์ ์ฉํด ๊ฐ ๊ฐ์ฒด๋ง๋ค ๋ฝ์ ๊ฑธ์ด ์ฐ๋ ๋๋ค์ด ์์ ํ๊ฒ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ฒ
- ๋ณต์ก๋๊ฐ ์ฆ๊ฐ, ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ ์์
- ๋ฐ๋ผ์ ํ์ด์ฌ ์ค๊ณ์๋ ๊ธ๋ก๋ฒ ์์ค์์ ํ๋์ ์ ๊ธ์ ์ฌ์ฉํด ํ ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํํ๊ฒ ํ์๋ ์์ด๋์ด๋ฅผ ๋์
- GIL์ด ํ์ํ๊ณ , ์ฐธ์กฐ ์นด์ดํธ์ ๋๊ธฐํ ๋ฌธ์ ์ ๊ตฌํ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๋ ๋ฐ ๊ธฐ์ฌํจ
์์ ์ ์์ด GIL์ ์ํฅ
I/O Bound ์์ ์์๋ ํฐ ์ํฅ์ด ์๋ค
- GIL์ I/O ์์ (ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ, ๋คํธ์ํฌ ์์ฒญ ๋ฑ) ์ค์๋ ํด์ ๋๋ฏ๋ก, ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ I/O ์์ ์ ์ํํ ๋๋ GIL์ ์ํฅ์ด ์ ์
- ๋ฐ๋ผ์ I/O Bound ํ๋ก๊ทธ๋จ์์๋ ๋ฉํฐ ์ฐ๋ ๋ฉ์ด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์
- ์์
- ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ ์ถ๋ ฅ ๋ฑ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ๋, ๊ฐ ์ฐ๋ ๋๊ฐ I/O ์์ ์ ์ํํ๋ ๋์ GIL์ ํด์ ํ๋ฏ๋ก ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์คํ๋ ์ ์์
CPU Bound ์์ ์์๋ ์ฑ๋ฅ ์ ํ๊ฐ ์ผ์ด๋๋๋ฐโฆ
- GIL์ CPU Bound ์์ (๊ณ์ฐ๋์ด ๋ง์ ์์ )์์ ๋ณ๋ชฉ์ ์ ๋ฐํ ์ ์์
- ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋์ด๋ GIL ๋๋ฌธ์ ์ค์ ๋ก ํ ๋ฒ์ ํ๋์ ์ฐ๋ ๋๋ง CPU์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ฅ์ ์ด ์์ด์ง
- ์ฆ, ๋ฉํฐ์ฐ๋ ๋ฉ์ ์ฌ์ฉํ๋๋ผ๋ CPU Bound ์์ ์์๋ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ๊ธฐ ํ๋ฌ
- ์์
- ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ
GIL์ ๊ทน๋ณตํ๋ ค๋ฉด
Multi-processing
- ํ์ด์ฌ์
multiprocessing
๋ชจ๋์ ์ฌ์ฉํ๋ฉด GIL์ ์ํฅ์ ๋ฐ์ง ์๊ณ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ฅผ ๋์์ ์คํ ๊ฐ๋ฅ - ํ๋ก์ธ์ค ๊ฐ์๋ GIL์ด ๊ณต์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ฝ์ด CPU์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
C ํ์ฅ ๋ชจ๋
- NumPy์ ๊ฐ์ด C๋ก ์์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ฅ ๋ชจ๋์ GIL์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
GIL์ ์ ๊ฑฐํ๋ ค๋ ๋ ผ์์ ์์ง์
- GIL์ ๋ช ๋ฐฑํ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์๋ ์ฑ๋ฅ ๋ฉด์์ ์ ํฉํ์ง ์์
- ๊ทธ๋ก ์ธํด ์ด๋ฅผ ์ ๊ฑฐํ๋ ค๋ ์์ง์์ด ์ต๊ทผ ๋ช ๋ ๊ฐ ํ๋ฐํ๊ฒ ์ด๋ค์ก์
- ํ์ฌ 2024๋ 10์ ๊ธฐ์ค GIL์ด ์์ ํ ์ ๊ฑฐ๋์ง ์์์ง๋ง, 3.12 ๋ฒ์ ๋ถํฐ GIL ์ ๊ฑฐ๋ฅผ ์ํ ๊ตฌ์ฒด์ ์ธ ๋ณํ๊ฐ ์๋๋๊ณ ์์
์ฃผ์ ๋ณํ์ ์งํ ์ํฉ
Python 3.9 ๋ฐ ๊ทธ ์ด์
- ์ด ์๊ธฐ๊น์ง GIL์ ์ ์ง๋์์ผ๋ฉฐ ๋ฉํฐ์ฐ๋ ๋ฉ ์ฑ๋ฅ์ด ์ ํ์ ์ด์์
- GIL์ ์ ๊ฑฐํ๋ ค๋ ๋ช ๊ฐ์ง ์ฐ๊ตฌ์ ํจ์น๊ฐ ์์์ผ๋, ํ์ด์ฌ์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ํธํ์ฑ ๋ฌธ์ ๋ก ์ค์ ๋ฐฐํฌ๋์ง๋ ์์์
Python 3.10 ~ 11
- GIL ์ ๊ฑฐ์ ๋ํ ๋ ผ์๊ฐ ํ๋ฐํด์ก๊ณ ํ์ด์ฌ ์๋น Guido Van Rossum์ด GIL ์ ๊ฑฐ ์ฐ๊ตฌ์ ์ฐธ์ฌ
- ํ๋กํ ํ์ ๊ณผ ์คํ์ ์ธ ๊ตฌํ์ด ์ ์๋จ
Python 3.12 (2023๋ ๋ฐํ)
- ๋๋์ด GIL ์ ๊ฑฐ๋ฅผ ์ํ ์ด๊ธฐ ์์ ์ด ํฌํจ๋จ!
- ์์ ํ GIL ์ ๊ฑฐ๋ ์๋์ง๋ง ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋ฉํฐ ์ฐ๋ ๋ ์์ ์ ์ ์ฌ์ ์ฑ๋ฅ ํฅ์์ ์ํ ์ค๋น๊ฐ ํฌํจ๋จ
- ๊ตฌ์ฒด์ ์ผ๋ก๋ sub-interpreter ๊ฐ์ ์์
์ด ์ด๋ค์ง
- ๊ฐ ์๋ธ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก GIL์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋ฐฉํฅ์ผ๋ก ์ค๊ณ๋์ด GIL์ ์ํฅ์ ์ค์ด๊ณ ์ ํจ
Python 3.13 (2024๋ 10์ ์ถ์)
- PEP 703 ๊ธฐ๋ฐ GIL์ ๋นํ์ฑํํ Free-threaded ๋ชจ๋๊ฐ ์ถ๊ฐ๋จ!
- ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋๋ ๊ฑด ์๋์ง๋ง, ํน์ ํ๋๊ทธ๋ฅผ ํฌํจํ์ฌ ์คํ์ Free-threaded ๋ชจ๋๋ก ์คํ ๊ฐ๋ฅ
- ์ฌ์ ํ ์คํ์ ์ธ ๋จ๊ณ์ด๊ธด ํจ
์ดํโฆ
- ์์ ํ GIL ์ ๊ฑฐ๊ฐ ๋ชฉํ๋ผ๊ณ ํจ