About me
home
Portfolio
home
🚫

Python GIL

λ‚ μ§œ
2023/07/19
νƒœκ·Έ
파이썬

Python GIL(Global Interpreter Lock)

μ •μ˜ : Python 인터프리터가 ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰ν•˜λ„λ‘ μ œν•œν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ΄λ‹€. 이λ₯Ό 톡해 Python의 λ©”λͺ¨λ¦¬ 관리λ₯Ό λ‹¨μˆœν™”ν•˜κ³  동기화 문제λ₯Ό μ΅œμ†Œν™”μ‹œν‚¨λ‹€.
λ“±μž₯ 이유: 파이썬(CPython)의 λ©”λͺ¨λ¦¬ 관리 방식인 μ°Έμ‘° μΉ΄μš΄νŒ…(reference counting)은 μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ°Έμ‘° 카운트λ₯Ό μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ, 레이슀 μ»¨λ””μ…˜(race condition)이 λ°œμƒν•œλ‹€. 이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ CPython은 GIL(Global Interpreter Lock)을 λ„μž…ν–ˆλ‹€.
GIL의 문제점: λŒ€λΆ€λΆ„μ˜ 파이썬 κ΅¬ν˜„μ²΄λŠ” CPython을 μ‚¬μš©ν•˜λ©°, 이 CPythonμ—μ„œλŠ” GIL둜 인해 μ—¬λŸ¬ μŠ€λ ˆλ“œμ˜ λ™μ‹œ 싀행이 μ‹€μ§ˆμ μœΌλ‘œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€. λ©€ν‹°μ½”μ–΄ ν”„λ‘œμ„Έμ„œμ—μ„œλ„ ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰ν•˜λ„λ‘ μ œν•œν•˜μ—¬, μ‹€μ œλ‘œ 병렬 처리λ₯Ό ν•˜μ§€ λͺ»ν•˜κ²Œ λ§Œλ“ λ‹€. μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό λ™μ‹œμ— μ‹€ν–‰ν•˜λ”λΌλ„ μ‹€μ œλ‘œλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ μ‹€ν–‰λ˜λ©°, μ΄λŠ” CPU λ°”μš΄λ“œ μž‘μ—…μ—μ„œ 병λͺ© ν˜„μƒμ„ μΌμœΌν‚¨λ‹€.
(Python μ™Έμ˜ μ—¬λŸ¬ 언어듀은 GIL μ œν•œ 없이 병렬 처리λ₯Ό ν†΅ν•œ λ©€ν‹°μŠ€λ ˆλ”©μ„ μ§€μ›ν•œλ‹€.)
GIL ν•΄κ²° 방법: GIL 문제λ₯Ό ν•΄κ²°ν•˜λŠ” ν•œ 가지 방법은 λ©€ν‹°ν”„λ‘œμ„Έμ‹±μ„ μ‚¬μš©ν•˜λŠ” 것이닀. 각 ν”„λ‘œμ„ΈμŠ€λŠ” 독립적인 GIL을 κ°€μ§€λ―€λ‘œ, 이λ₯Ό 톡해 병렬 싀행을 ν™œμ„±ν™”ν•  수 μžˆλ‹€. multiprocessing λͺ¨λ“ˆμ€ 각각의 ν”„λ‘œμ„ΈμŠ€κ°€ λ³„λ„μ˜ GIL을 가지기 λ•Œλ¬Έμ—, μ‹€μ œλ‘œ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신과 λ©”λͺ¨λ¦¬ κ³΅μœ λŠ” μŠ€λ ˆλ“œμ— λΉ„ν•΄ 비ꡐ적 λ³΅μž‘ν•˜κ³  λΉ„μš©μ΄ 더 많이 λ“ λ‹€.

Next β†’ Thread module