* 병행성(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 리턴 후 메인 루틴에 제어권을 전달함 타 함수는 일 지속함)
'Python' 카테고리의 다른 글
[Python 고급] 2. Meta class (0) | 2021.08.01 |
---|---|
[Python 고급] 1. variable scope, context Manager (0) | 2021.07.31 |
[Python 중급] 1. 파이썬 클래스, 시퀸스, 일급함수 (0) | 2021.07.31 |
[Python 기초] 리스트 축약 표현 (0) | 2021.07.30 |
[Python 기초] 파이썬 자료형 (0) | 2021.07.30 |