새소식

활동들/인프런 대학생 LEAF 2기

[인프런 리프 2기] 6. 파이썬 병행성

  • -
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

 

 

강의 링크:

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

 

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original) - 인프런 | 강의

본 강의는 파이썬 기초를 배운 학습자가 파이썬을 실무에 활용할 수 있도록 수준 높은 문법을 배우는 데 중점을 두고 있습니다. 파이썬만의 차별점을 파악하고 빠르게 익힘으로써 중급 레벨의

www.inflearn.com

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.