# gil
자바와 파이썬: 동기, 비동기, 멀티프로세스, 멀티스레드의 깊은 이해
1. 자바와 파이썬의 비교 소개 프로그래밍 세계에서 자바와 파이썬은 가장 널리 사용되는 언어 중 두 개입니다. 자바는 객체 지향 프로그래밍과 강력한 멀티스레딩 능력으로 잘 알려져 있습니다. 반면에 파이썬은 그 간결한 문법과 코드 가독성으로 사랑받고 있습니다. 또한, 파이썬의 경우 Global Interpreter Lock(GIL)이라는 특징으로 인해 멀티스레드 처리에서 제한적인 경우도 있습니다. 오늘 우리는 이 두 언어에서 동기, 비동기 처리와 멀티프로세스, 멀티스레드에 대해 알아볼 것입니다. 2. 동기와 비동기: 개념 및 차이점 동기(synchronous)와 비동기(asynchronous)는 프로그래밍에서 중요한 개념 중 하나입니다. 동기는 작업이 순차적으로 실행되는 것을 의미합니다. 한 작업이 완료될 때까지 다음 작업은 대기 상태입니다. 반면에 비동기는 작업이 독립적으로 실행되는 것을 의미합니다. 즉, 한 작업이 완료되지 않아도 다른 작업이 실행될 수 있습니다.
파이썬의 GIL
GIL(Global Interpreter Lock) 정의:멀티쓰레드에서 다른 객체에 접근하는 것을 막기 위해 한번에 하나의 바이트코드를 실행하는 것 (In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe.) 한번에 하나의 쓰레드를 사용하기 때문에 멀티쓰레드의 병렬적 동작이 불가능하다. >## 단순 연산의 멀티쓰레드와 멀티프로세스 단순 연산 단순 연산의 멀티 쓰레드 동작과정  이를 가능하게 하기 위해, CPython 에서는 Python interpreter 자체에 대한 lock 을 한다. 그래서 이름도 Global Interpreter Lock 이다. 그럼, GIL 이 왜 필요할까? 그 이유는, CPython 의 메모리 관리 방식에 있다. CPython 는 메모리 관리 방식으로,

[CS/Python]Thread(1)-GIL과 Thread 구현/실행, Event
Thread 프로세스와 스레드에서 스레드가 무엇인지 알아봤습니다. 이번에는 파이썬에서 스레드를 구현하고 사용하는 기본적인 방법과 자원의 무결성과 동기화를 위한 처리에 관해서 알아보도록 하겠습니다. GIL(Global Interpreter Lock) 파이썬 코드는 인터프리터가 코드를 번역하고 실행함으로써 실행됩니다. 즉, 파이썬 코드가 실행되기 위해서는 인터프리터라는 자원을 소유하고 있어야 하는 것입니다. GIL은 인터프리터가 한 시점에 하나의 스레드만 실행할 수 있도록 해주는 인터프리터 소유에 관한 Lock입니다. Python의 스레드 동작 멀티코어 환경에서 여러개의 스레드를 동작시킨다면 각각의 스레드들이 병렬적으로 동작하는 것을 생각하실겁니다. 하지만 파이썬에서는 GIL로 인

GIL(Global Interpreter Lock)
GIL이란? 파이썬 인터프리터가 한 스레드만 하나의 바이트코드를 실행시킬 수 있도록 해주는 Lock GIL의 목적? 파이썬은 기본적으로 레퍼런스 카운팅을 사용하는데, 이 레퍼런스 카운트 변수가 멀티스레드 환경에서 Race Condition을 야기할 수 있기 때문에 하나의 공통된 자원을 여러 스레드에서 접근하여 발생하는 이런 문제를 예방하기 위해서 GIL 사용 Critical Section 병렬프로그래밍에서 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 명령문 또는 코드의 일부 영역 Race Condition 두 개 이상의 프로세스(혹은 스레드)가 공통 자원을 병렬적으로 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 실행 결과가 같지 않고 달라지는 상황을 말한다. Mutex 보통 GIL을 Mutex로 사용. (Cpython 코드)
Python GIL
GIL GIL > In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. 파이썬 인터프리터가 한 번에 하나의 바이트코드만 실행할 수 있도록 제한. -> 스레드가 병렬적으로 실행될 수 없음 Python의 GC 파이썬의 GC는 객체의 참조 횟수가 0이 되면 객체 메모리를 해제함. 여러 스레드가 동시에 객체에 접근하면 race condition 발생하여 참조 횟수를 관리함에 있어 Thread-safe하지 않음. 모든 객체에 lock을 거는 방식은 관리하기 어려우니 GIL 사용. 멀티스레드 속도 CPU bound job에서는 결국 순차적으로 실행되는데 context switching 비용만 증가하여 비효율적. I/

python - memory optimization (2) : GC, reference counter and GIL
Python 메모리 관리 기법 > "interpreting" 의 전체 과정과 cpython이 C로 python 메모리 할당과 관리를 어떻게 하는지 큰 그림을 살펴봤다. 할당을 했으면 해제는 어떻게 할까? python이 메모리를 해제하는 방법과 그 때문에 발생하는 GIL에 대해 알아보자. 파이썬을 사용하면 메모리의 할당과 해제를 프로그래머가 직접할 필요가 없다. 오히려 올바르지 않게 직접하면 역효과가 난다. "객체가 더 이상 사용되지 않으면", 알아서 해당 객체를 메모리에서 해제해야 한다. 그럼 어떤 객체가 "더 이상 사용되지 않는" 객체일까? 이를 위해 파이썬은 레퍼런스 카운팅과 가비지 컬렉션의 두가지 방법을 모두 사용한다. 사실 레퍼런스 카운팅 자체도 GC에 포함시키기도 하지

Python 멀티 스레드
멀티 스레드? 멀티 스레드는 하나 프로세스 내에서 복수 스레드가 동시에 작업을 수행하는 것이다. 멀티 스레드 환경에서 스레드끼리 메모리를 공유하지만 각 스레드 마다 registers, stack, pc 모두 독립적으로 존재한다. 파이썬으로 구현해보는 멀티 스레딩 기본적으로 파이썬에서 하나 프로세스에 하나 스레드 작업을 수행하지만 threading을 이용하면 스레드 작업을 해 볼 수 있다. 1부터 100,000,000까지 자연수를 더하는 간단한 함수를 멀티 스레드 환경에서 수행하려고 했다. 스레드 갯수에 따른 수행 시간을 비교하기 위해서 스레드 갯수를 1, 2, 4개로 구분하여 테스트를 실행하였다. 최종 결과 스레드 1개인 경우 스레드 2개인 경우 
Python의 GIL
표준 Python(CPython)은 인터프리터 언어 GIL를 소개하기전에 먼저 Python을 동작시키는 구현체에대해 알아볼 필요가 있습니다. Python은 구현시키는 구현체에 따라 여러 종류의 Python(CPython, Jython, IronPython, Stackless Python 등)이 있고 이중 우리가 보통 아는 표준 Python은 CPython 구현체가 문장마다 번역하여 코드를 실행시키는 Interpreter Language 입니다. GIL(Global Interpreter Lock) 이란? 위키피디아에서 GIL이란 말을 인용하자면 > *A global interpreter lock (GIL) is a mechanism used in computer-language interpreters to synchronize the execution of threads so that only one native thread (per p

[PYTHON]GIL & Multi Thread
* program : 작업을 위해 실행하는 파일 process : 운영체제가 생성하는 작업의 단위(=컴퓨터에서 실행중인 프로그램) thread : process 안에서 공유되는 메모리를 바탕으로 생성하는 작업의 실행 단위 Thread safe : 하나의 스레드가 자원에 접근하여 작업을 수행하는 상태 race condition(경쟁상태) : 여러 스레드가 하나의 공유 자원이 동시에 접근하면서 발생하는 문제 mutex(상호배제) : 공유 자원에 하나의 스레드만 진입하며 작업을 처리할 수 있도록 만들어진 lock 개념 garbage collection : 파이썬에서 쓰이는 메모리 관리 기법. 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능 Reference counting : 쓰레기 수집(garbage collection)의 한 방식 context swich : 프로세스/스레드

TIL 46. GIL(Global Interpreter Lock)
Today's topic > 이번 posting에서는 python으로 multithreading 작업을 할 때 만날 수 있는 GIL에 대해서 정리해 보도록 하겠다. 👉 What is "GIL"? 우리는 Python으로 programming을 하면서 multithreading 작업을 할 시 GIL이라는 단어를 만난다. GIL은 무엇일까? >GIL은 Global Interpreter Lock의 약자 이다. GIL은 python 객체에 대한 access를 보호하여 여러 thread가 한번에 python bitecode를 한 번에 access하는 것을 방지하는 mutex이다. 즉, 한 process 내에서 python interpreter(Cpython)는 한 시점에 한 thread에서만 실행이 될 수 있다. 다른 말로 하면 multithread를 사용할 수 있으나 병렬로 사용은 불가능 하다. Mutex 란? 동시 프로그래밍에서 공유 불가능한 자원의 동시 사용을
[python] GIL과 병렬프로그래밍
GIL(Global Interpreter Lock, 전역 인터프리터 잠금) 멀티 스레딩은 스레드끼리 자원을 공유하는데, 하나의 자원을 동시에 여러 스레드가 가져가는 상황에서 충돌이 발생할 수 있다. 이 경우에 하나의 스레드에 문제가 생길 경우 다른 스레드에 의해 차단될 수 있다. 이러한 이유로 파이썬에서는 GILGlobal Interpreter Lock, 전역 인터프리터 잠금)를 도입하였다. GIL 이란? 한 번에 1개의 스레드만 유지하는 락이며, 하나의 스레드가 다른 스레드를 차단해서 제어를 얻는 것을 막아준다. 즉, 하나의 스레드가 문제가 생기더라도 다른 스레드에 의해서 차단되지 않게 한다. 이러한 이유로 파이썬에서는 스레드를 통해 CPU bound 코드에서 병렬성 연산을 수행하지 못한다. 단, Network I/O bound 코드에서는 멀티스레딩을 유의미하게 사용할 수 있다. 멀티 프로세싱(multi processing) GIL 정책에 의해

[Python] GIL(Global Interpreter Lock)
면접에서 대답하지 못했던,, GIL... 싱글스레드와 멀티스레드도 대답을 못했다.(반성하자 내 자신) 머리가 백지가 된 상태라 말 못하는 내 자신이 어이가 없었는데 덕분에 다시는 안 잊을것 같다..! 오히려 좋아~ 싱글스레드와 멀티스레드 코드 속도 비교 하나의 스레드가 두 개의 작업을 연속적으로 실행 두 개의 스레드가 각각 하나의 작업을 실행 출처 : 링크 본래 멀티쓰레딩은 싱글스레드, 즉 혼자 할일을 여럿이 같이 함으로써 성능을 향상시키는 것에 목적이 있다. 그런데 왜 멀티스레드가 더 오래걸리는 결과가 나왔을까? 그 원인을 알기 위해서는 GIL에 대한 설명이 필요하다. what is GIL? 위의 예시는 자바나 다른 언어처럼 완벽한
GIL과 병렬프로그래밍1
GIL Python은 인터프리터 언어로 인터프리터 내에서 명령어 한 줄 단위로 컴파일과 실행이 된다. GIL(Global Interpreter Lock)은 하나의 스레드가 인터프리터에서 실행되고 있을 때, 인터프리터에 락을 걸어 다른 스레드가 사용할 수 없도록 막아두는 것이다. 일종의 Mutex(임계 영역)인 셈이다. 따라서 원칙적으로 Python에서는 Multi-Threading이 불가능하다. 스레드를 여러 개 생성해 실행시키더라도 여러 개의 스레드가 병렬적으로(각각 동시에) 실행되는 것이 불가능하기 때문이다. GIL의 등장배경 Python의 가장 보편적인 구현체는 C언어로 구현된 CPython이다. Python의 대부분의 객체는 포인터 변수로 선언되어 힙 공간에 위치하게 되는데, 이때 객체마다 type과 reference type을 갖는다. 🤔Type은 자료형일테고, Reference Type은 뭘까? Reference Type은 해

[Python] Thread, Process, GIL (Global Interpreter Lock) 복습
GIL에 접근하기 전 프로세스와 스레드 개념에 대해 다시 복습했다. 프로세스와 스레드 이해하기 주소값 컴퓨터 언어가 변수를 선언하면 RAM(Random Access Memory, 임의의 영역에 접근하여 읽고 쓰기가 가능한 주기억장치)에 저장이 된다. 이 램은 일시적인 장치이기 때문에 전원이 내려가는 순간 데이터는 다 사라진다. 그럼에도 불구하고 램을 쓰는 이유는 램이 빠르기 때문이다. 만일 C언어의 경우라면 라고 선언을 할 경우, a, b, c의 주소값은 모두 다르다. 그러나 파이썬은 모든 것을 객체로 선언한다. 즉, 위의 경우에서 int 1도 객체로 고유 주소값을 가진다. 따라서 파이썬에서는 라고 선언을 할 경우, a, b, c는 모두 같은 주소값을 바라보게 된다. 여기서 만약 로 a가 2가 된다면 int 2 객체가 가진 고유 주소값으로

🙈 파이썬 데드락 & 락
락이란? > 파이썬에서는 GIL (global interpreter lock) 방식으로 인터프리터에 락을 겁니다. >>인터프리터 : 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경 >> 락을 건다 : 칸이 하나 뿐인 화장실에 사람들이 앞사람이 나오기까지를 기다리는 것처럼, 미리 선점한 사람이 락을 걸면 스레드는 락이 풀릴 때 까지 기다림. 즉! 동시에 하나 이상 스레드가 실행이 되지 않습니다.(다중 코어가 아님) 📌 그럼, 파이썬은 왜 GIL 방식을 채택했을까? 파이썬코드는 인터프리터를 통해 실행되기 때문에 파이썬의 덩치가 크기 때문에 📌 문제가 되진 않을까? 코어를 하나밖에 사용하지 못하기 때문에 multi threads 를 지원하는 것이 성능에 큰 문제가 있을 거라고 생각 할 수 도 있

[TIL][Git] Github로 무료 호스팅 하기 & 리액트 작업 무료 호스팅 하기
Github로 무료 호스팅 하기 이 방법을 알게된지는 꽤 오래되었지만, 아마 나와같은 초보 개발자들은 아직 모르는 사람이 많다고 생각하여 혹시 누군가 이 글을 보게된다면 조금이나마 도움이 될 수 있도록 깃헙으로 무료 호스팅 하는법을 적어보려 한다! 이 방법을 찾게 된 계기는 내가 한 작업물을 친구들 및 주변사람들에게 자랑하고 싶은 욕구에서 시작되었다... 많지않은 돈을 내고 구입하여 사용할 수 있지만, 아직은 초보 개발자로써 무료로 자신만의 홈페이지 또는 포트폴리오 사이트를 제작하는데 이만한 방법이 없을것 같다. 또한 아직 제한은 모르지만 계속해서 만들어본 결과 딱히 갯수제한은 없는듯 하다! 
해당 포스팅은 python의 GIL을 이해하고자 아래 post를 참조하여 작성하였다. GIL을 해결하겠다거나, 성능을 개선하겠다는 내용은 없다. GIL을 이해하고, threading, multiprocess을 보다 적재적소에 사용하고자 함이다. 많은 내용이 생략됐으므로, 원글을 참조하시길 추천드린다. https://realpython.com/python-gil/ 해당 글을 참조하여 작성됨 GIL은 하나의 스레드만 Python Interpreter에서 제어할수 있도록 하는 mutex이다. threading library를 사용해서 multi thread로 프로그램을 실행하여도 python interpreter(정확히 말하자면 GIL)에 의해 한번에 하나씩의 thread만 실행이 된다. Reference Counting python은 메모리관리를 위해 reference counting을 사용한다. python에서 생성된 객체에는 객체를 가리키는 참조 수를 추적하는 참조