심화지기 : 코루틴, GIL

hyuckhoon.ko·2024년 2월 6일
0

코루틴

정의

메인루틴과 서브루틴이 서로 협력하는 관계로 멀티태스킹하여, 실행의 중단과 재개를 허용하는 컴퓨터 프로그램 컴포넌트

특징

def sub_routine():
	a = yield
    print(f"received {a}")
    
# main
sub_routine = sub_routine()
sub_routine.send(1)

코루틴 그림 예시

프로세스

실행 중인 프로그램

(보조기억장치에 저장되어 있는 프로그램은 프로세스가 아니다.)

스레드

프로세스 내 실행의 흐름 단위

하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.

예를 들어보자.
유튜브를 접속한다.

  • 마우스 커서가 올라간 영상에서는 미리보기가 작동하고 있고
  • 영상 검색을 할 수 있고
  • 광고란에는 코카콜라 영상이 실행되고 있고
  • 스크롤을 내리면 더 많은 영상 리스트들을 볼 수 있다

이렇게 서로 다른 일을 하는 스레드지만, 하나의 프로세스다.

멀티 프로세서 vs 멀티 스레드

멀티 프로세서

다수의 프로세스를 동시에 실행하는 것

멀티 스레드

다수의 스레드로 프로세스를 실행하는 것

차이

프로세스끼리는 자원을 공유하지 않는다.
스레드는끼리는 프로세스의 자원을 공유한다.


출처 : Multithreading and Multiprocessing in 10 Minutes

멀티 스레드의 단점

멀티 프로세스 환경에서 단일 프로세스의 이슈는 부작용이 적다.
하지만 멀티 스레드 환경에서는 공유하는 자원이 많기 때문에 특정 스레드의 이슈가 다른 스레드에 영향을 줄 수 있다.

코루틴은 왜 가볍다고 할까

코루틴은 light-weight 스레드라고 한다.
파이썬은 기본적으로 싱글 스레드로 작동하기 때문이다.
싱글 스레드 환경에서 코루틴은 작동한다.

GIL


▲ GIL이 스레드 실행을 제어하는 방식. 실행 중인 녹색 스레드, 차단된 빨간 스레드

GIL이란

GIL(Global Interpreter Lock)은 파이썬의 다중 스레드 환경에서 여러 스레드가 동시에 파이썬 바이트 코드를 실행하지 못하게 하여 한 번에 하나의 스레드만 실행하도록 하는 뮤텍스 락 기반의 인터프리터 매커니즘

파이썬은 가비지 컬렉션을 기반으로 메모리를 관리한다.
여러 개의 쓰레드가 동시에 하나의 자원에 접근할 때 Race Condition이 발생한다.
이 경우 thread-safe 하지 않다고 표현한다.

thread-safe

멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 말함

뮤텍스 락

술집에 화장실이 하나만 있다.
그리고 화장실 열쇠는 계산대 앞에 걸어둔다.

계산대에 열쇠가 없다는 의미는 누군가가 현재 화장실(자원)을 사용하고 있다는 것이다.
얼굴도 모르고, 친하지도 않은 손님끼리 동시에 화장실(자원)을 사용할 수 없다.
화장실 열쇠와 같은 역할을 구현한 것이 뮤텍스 락이다.

화장실을 가고 싶은 손님은 틈틈이 계산대 앞에 화장실 열쇠가 있는지 술을 마시다가도 확인해야 한다.
그래서 이 방식을 바쁜 대기(busy wait)라고도 한다.

(+ 그 외 자원 동기화 기법에는 세마포, 모니터가 있다.)

0개의 댓글