generator
Generator는 iterator
를 생성해주는 함수로, 함수 안에 yield
키워드를 사용함.
- iterator는 next() 메소드를 사용해 데이터를 순차적으로 접근할 수 있는 함수.
- Generator는 한번에 모든 데이터를 메모리에 적재할 필요가 없어서 메모리 효율이 높고, 계산 결과가 필요할 때까지 계산을 늦출 수 있으므로, 수행 시간이 긴 연산을 필요한 순간까지 늦출 수 있다는 장점을 가지고 있음.
GIL
GIL은 한번에 하나의 스레드만 수행할 수 있도록 인터프리터에 lock을 거는 기능
- 파이썬 객체는 Garbage Collection 기능을 위해,
reference count
를 가지고 있는데, 해당 객체를 참조할 때마다 reference count 값을 변경해야 함.
- 멀티 스레드를 실행하게 되면, 각 스레드가 공유하는 객체들에 대해 각각 lock을 거는 경우, 성능상 이슈와 deadlock 과 같은 위험이 존재하며, 인터프리터 레벨에서 한 시점에 실행하는 스레드는 1개로 제한한 것이다. 그래서 멀티 CPU 환경이라 할지라도, 파이썬 스레드는 어느 시점에나 1개의 스레드가 실행되는 단점이 있다.
- 이를 해결하려면 multiprocessing 라이브러리를 사용해야한다. 이 경우 개별 프로세스가 생성되고, 프로세스 별로 인터프리터 락이 걸리기 때문에, 동시 실행이 가능하다.