728x90
4주차 미션: 섹션 6 ~ 7
섹션 6에서는 파이썬 병행성를 배웠다.
🌱 01
- 병행성, 흐름제어 설명
- 이터레이터(Iterator)
- 제너레이터(Generator)
- __iter__, __next__
- 클래스 기반 제너레이터 구현
🚩 next 패턴
class WordSplitter:
def __init__(self, text):
self._idx = 0
self._text = text.split(' ')
def __next__(self):
# print('Called __next__')
try:
word = self._text[self._idx]
except IndexError:
raise StopIteration('Stopped Iteration. ^_^;;')
self._idx += 1
return word
def __repr__(self):
return 'WordSplit(%s)' % (self._text)
wi = WordSplitter('Do today what you could do tomorrow')
print(wi)
print(next(wi))
print(next(wi))
print(next(wi))
print(next(wi))
print(next(wi))
print(next(wi))
print(next(wi))
# print(next(wi)) # Exception
🚩 Generator 패턴
# Generator 패턴
# 1. 지능형 리스트, 딕셔너리, 집합 -> 데이터 양 증가 후 메모리 사용량 증가 -> 제너레이터 사용 권장
# 2. 단위 실행 가능한 코루틴(Coroutine) 구현과 연동
# 3. 작은 메모리 조각 사용
class WordSplitGenerator:
def __init__(self, text):
self._text = text.split(' ')
def __iter__(self):
for word in self._text:
yield word # ⭐ / 제너레이터
def __repr__(self):
return 'WordSplitGenerator(%s)' % (self._text)
wg = WordSplitGenerator('Do today what you could do tomorrow')
wt = iter(wg)
print(wt, wg) # wt -> generator
print(next(wt))
print(next(wt))
print(next(wt))
print(next(wt))
print(next(wt))
print(next(wt))
print(next(wt))
# print(next(wt))
🌱 02
- 제너레이터 실습
- Yield 실습 ⭐⭐⭐
- Itertools 실습
🚩 Yield
- yield: iterable하게 만들어 준다. for문에서도 사용가능
- yield [temp] : 다음 키워드(yield)가 나올 때까지 temp를 return하고 멈춘다.
- send -> 메인 루틴과 서브루틴이 서로 data를 교환 가능
🚩 itertools
# Generator 중요 함수
# count, takewhile, filterfalse, accumulate, chain, product, groupby...
import itertools
gen1 = itertools.count(1, 2.5)
# itertools.count(시작값, 증가 단위) -> 주의! 무한대, 끝이 없음
# 조건
gen2 = itertools.takewhile(lambda n : n < 1000, itertools.count(1, 2.5))
# 필터 반대 (역할)
gen3 = itertools.filterfalse(lambda n : n < 3, [1,2,3,4,5]) # 조건의 반대
# 누적 합계
gen4 = itertools.accumulate([x for x in range(1, 101)])
# 연결
gen5 = itertools.chain('ABCDE', range(1, 11, 2)) # ⭐ -> 서로 다른 iterable들을 하나로 묶어 연결
gen6 = itertools.chain(enumerate('ABCDE'))
# 개별
gen7 = itertools.product('ABCDE')
# 연산(경우의 수)
gen8 = itertools.product('ABCDE', repeat=4) # repeat만큼 반복
# 그룹화
gen9 = itertools.groupby('AAAABBBBCCCCDDDDEEE')
🌱 03
- 흐름제어, 병행성 처리
- 메인루틴 <-> 서브루틴
- 쓰레드 차이 설명
- 제너레이터 -> 코루틴 설명
🚩 코루틴 (Coroutine)
# 코루틴
# GEN_CREATED : 처음 대기 상태
# GEN_RUNNInG : 실행 상태
# GEN_SUSPENDED : Yield 대기 상태
# GEN_CLOSED : 실행 완료 상태
# StopIteration 자동 처리(3.5 -> await)
# 중첩 코루틴 처리
def generator1():
for x in 'AB':
yield x
for y in range(1, 4):
yield y
def generator2():
yield from 'AB'
yield from range(1, 4)
🌱 04 : Futures (동시성)
- 비동기 작업 처리
- 파이썬 GIL 설명
- 동시성 처리 실습 예제
- Process, Thread 예제
🚩 GIL: Global Interpreter Lock
파이썬에 GIL이라는 특징이 있기 때문에, 무조건 thread가 많다고 해서 좋은 것은 아니다.
🌱 05
- Futures wait 예제
- Futures as_compled
- 동시 실행 결과 출력
- 동시성 처리 응용 예제 설명
총 정리
# Chapter06
# 병행성(Concurrency)
# 이터레이터, 제너레이터 ⭐
# Iterator, Generator
# 파이썬 반복 가능한 타입
# collections, text, list, Dict, Set, Tuple, unpacking, *args... : iterable
# 반복 가능한 이유? -> iter(x) 함수 호출
# 병행성(Concurrency) : 한 컴퓨터가 여러 작업을 동시에 수행 -> 단일 프로그램 안에서 여러 일을 쉽게 해결
# 병렬성(Parallelism) : 여러 컴퓨터가 여러 작업을 동시에 수행 -> 속도
# 코루틴(Coroutine)
# 코루틴 : 단일(싱글) 스레드, 스택을 기반으로 동작하는 비동기 작업
# 쓰레드 : os 관리, CPU 코어에서 실시간, 시분할 비동기 작업 -> 멀티쓰레드
# yield, send : 메인 <-> 서브
# 코루틴 제어, 상태, 양방향 전송
# 서브루틴 : 메인루틴 호출 -> 서브루틴에서 수행(흐름제어)
# 코루틴 : 루틴 실행 중 중지 -> 동시성 프로그래밍
# 코루틴 : 쓰레드에 오버헤드 감소
# 쓰레드 : 싱글쓰레드 -> 멀티쓰레드 -> 복잡 -> 공유되는 자원 -> 교착 상태 발생 가능성, 컨텍스트 스위칭 비용 발생, 자원 소비 가능성 증가
# def -> async , yield -> await
# Futures 동시성
# 비동기 작업 실행
# 지연시간(Block) CPU 및 리소스 낭비 방지 -> (File) Network I/O 관련 작업 -> 동시성 활용 권장
# 비동기 작업과 적합한 프로그램일 경우 압도적으로 성능 향상
# futures : 비동기 실행을 위한 API를 고수준으로 작성 -> 사용하기 쉽도록 개선
# concurrent.Futres
# 1. 멀티스레딩/멀티프로세싱 API 통일 -> 매우 사용하기 쉬움
# 2. 실행 중인 작업 취소, 완료 여부 체크, 아임아웃 옵션, 콜백주기, 동기화 코드 매우 쉽게 작성 -> Promise 개념
# 2가지 패턴 실습
# concurrent.futures 사용법1
# concurrent.futures 사용법2
# GIL : 두 개 이상의 스레드가 동시에 실행될 때 하나의자원을 액세스 하는 경우 -> 문제점을 방지하기 위해
# GIL 실행, 리소스 전체에 락이 걸린다. -> Context Switch(문맥 교환)
# GIL 우회 : 멀티프로세싱 사용, CPython
강의 링크:
728x90
'활동들 > 인프런 대학생 LEAF 2기' 카테고리의 다른 글
[인프런 리프 2기] 리프 활동 후기 🌱 (0) | 2021.04.09 |
---|---|
[인프런 리프 2기] 7. AsyncIO 멀티 스크랩핑 실습 (0) | 2021.04.02 |
[인프런 리프 2기] 5. 파이썬 일급함수 (0) | 2021.03.29 |
[인프런 리프 2기] 4. 파이썬 데이터 모델 (0) | 2021.03.29 |
[인프런 리프 2기] 3. 파이썬 데이터 모델 (0) | 2021.03.22 |