[Programming] Python's GIL

[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 ์ œ๊ฑฐ๊ฐ€ ๋ชฉํ‘œ๋ผ๊ณ  ํ•จ
© 2024 Seungwon Bae ๐Ÿ‡ฐ๐Ÿ‡ท