Python

[ Python : 동시성과 병렬성 문법 배우기 ] 1. Multithreading

noahkim_ 2021. 8. 1. 16:20

* 이 포스팅은 인프런강의 "동시성과 벙렬성 문법 배우기" 강의를 듣고 공부한 내용의 포스팅임

 

1. Multithreading

  • Difference between Process and Thread
    프로세스 : 운영체제에서 할당 받는 자원 단위
      cpu동작 시간, 주소 공간(독립적)을 할당받음. 파이프, 파일, 소켓으로 프로세스간 통신 (context switching)

    스레드 : 프로세스 내 실행단위. 프로세스 자원 사용. stack만 별도이며 나머지는 공유함. 
      메모리를 공유하며 한 스레드가 다른스레드에 영향을 끼침 -> 동기화가 필요함

    멀티 스레드 : 여러 스레드로 구성 후 처리. 교착상태 발생가능
      자원 소모가 감소고 통신 부담도 적어지지만 디버깅이 어려움

    멀티 프로세스 : 문제 시 프로세스를 죽임. 캐시 체인지 발생, Cost 비용이 큼(오버헤드 증가). 복잡한 통신방식

  • GIL (global Interpretor Lock)
    여러 스레드 사용시에도 하나의 스레드만 python object에 접근 가능함 (접근 시 자원에 락이 걸림)

    CPython : 바이트파일. 메모리 관리가 취약하므로 Thread-safe를 의도하여 만들어진 개념.

    병렬 처리시 멀티 프로세싱 or asyncio 로 구현함
     

  • Thread-Basic
    'threading'모듈 import후
    thread(target="함수", args="인자") 호출 시 서브 스레드 생성됨

    start() : 서브 스레드 작업 시작 (메인 스레드 종룔 상관없이 주어진 일을 끝까지 함)
    join() : 자식스레드가 일이 끝나기 전까지 메인 스레드는 기다림.


  • Daemon, Join
    데몬 : 백그라운드에서 작동함. 메인스레드 끝나면 즉시 종료됨
    'daemon=True' 옵션으로 생성
    isDaemon()으로 확인 가능

  • ThreadPoolExecutor
    스레드를 생성함. 대기중인 스레드는 큐에 담음.

    'concurrent.Futures' 의 ThreadPoolExecutor로 스레드 생성

  • Lock, deadlock
    세마포어 : 공유된 자원을 한개의 프로세스만 접근처리 하도록 함. 지정된 세마포어 변수 만큼 프로세스 접근가능
    뮤텍스 : 공유된 자원을 여러 스레드가 접근하는 것을 막음. 오직 1개의 프로세스만 접근 가능
    => 레이스 컨디션 방지(Lock 사용)

    Lock : 상호배제를 위한 잠금처리 기능
    deadlock : 교착상태를 뜻함.

    threading.lock().acquire() : 락 사용
    threading.lock().release() : 락 반환

    해당 코드들의 사이에 있는 공유자원에 대한 작업은 동기화됨

    with문을 사용하여 자동으로 acquire(), release() 하도록 함. 편리함.


  • Prod and Cons Using Queue
    생산자 소비자 패턴
    멀티스레드 디자인 패턴. 중개역할의 디자인

    Queue는 중개자 역할로 파이프라인이다. 
    해당 Queue를 스레드 생성 시 공유되도록 인자로 넣어줌