Python

[Python 중급] 2. 파이썬 병행성

noahkim_ 2021. 7. 31. 15:32

* 병행성(Concurrency) : 한 컴퓨터가 여러일을 동시에 실행함. -> 내가 한 일들의 마지막 시점을 알아야 함.
* 병렬성(Parallalism) : 여러 컴퓨터가 여러 일을 동시에 실행

 

1. 병행성

iterator : 반복가능한 객체를 생산함(iterable) 

 __iter__ : 반복가능한 객체의 함수. 이터레이터가 생산됨. 반복시 iter()함수로 인자 1개씩 접근함 ( next() )

 

  • Generator
    반복 가능한 객체를 리턴함. 
    코루틴과 연동하며 작은 메모리 조각을 뜻함. 
    yield시 next()호출시에 리턴할 변수를 출력함. 다음 yield로 이동함


  • Coroutine
    단일 싱글 스레드
    스택 기반 비동기 작업

    * 스레드(멀티스레드)
      OS에서 관리. CPU 코어에서 실시간, 시분할 비동기 작업
     공유자원 접근 시, 교착상태 발생 가능 (+ 컨텍스트 스위칭 비용이 큼 )

    yield : 메인 <-> 서브 상호작용
      제어, 상태, 양방향 전송 -> 메인 루틴과 서브 루틴에 데이터 교환이 가능함.
      루틴 실행 중 중지 : 동시성 프로그래밍
      스레드에 비해 오버헤드 감소

 

2. 병렬성 

Futures(동시성) : 비동기 작업을 처리함. 지연시간 및 CPU 리소스 낭비를 방지함

비동기 실행을 위한 API를 고수준으로 작성

- 멀티스레딩 / 멀티 프로세싱 API를 통일

- 실행중 작업 취소, 완료 여부 체크, 타입아웃 옵션, 콜백 추가

 

  • GIL (global interpreter lock) 
    동시에 하나의 자원을 두개 이상의 스레드가 접근하는 경우 해당 자원에 락이 걸림
    Deadlock 해결을 위함임. 문맥교환도 제한함
    -> 멀티프로세싱 or CPython을 사용하여 우회할 수 있음 (동시성 처리 코딩이 필요함)

ThreadPoolExecutor() : 멀티스레싱 시 사용. 스레드 생성 (함수를 부를 시 스레드가 생성되며 동시작업시에 사용됨)
ProcessPoolExecutor() : 멀티프로세싱 시 사용. 

 

3. AsyncIO 멀티 스크랩핑
Coroutine의 확장판 : 비동기 I/O Coroutine 작업

Non-blocking 비동기 처리(다중스레싱) : futures 객체를 모아 gather해서 실행함

(Blocking I/O : 호출된 함수가 자신의 작업이 완료될 때까지 제어권을 가짐. 타함수는 대기)

(Non-Blocking I/O : 서브루틴의 호출 함수가 yield 리턴 후 메인 루틴에 제어권을 전달함 타 함수는 일 지속함)