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

2021. 4. 2. 22:04·활동들/인프런 대학생 LEAF 2기
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
저작자표시 (새창열림)

'활동들 > 인프런 대학생 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
'활동들/인프런 대학생 LEAF 2기' 카테고리의 다른 글
  • [인프런 리프 2기] 리프 활동 후기 🌱
  • [인프런 리프 2기] 7. AsyncIO 멀티 스크랩핑 실습
  • [인프런 리프 2기] 5. 파이썬 일급함수
  • [인프런 리프 2기] 4. 파이썬 데이터 모델
soyang.
soyang.
코딩 및 개발 일지를 기록합니다.
  • soyang.
    소소한 코딩일지
    soyang.
  • 전체
    오늘
    어제
  • 링크

    • Github 🐾
    • 포트폴리오 📓 (리뉴얼중)
    • LinkedIn 👩🏻‍💼
  • 공지사항

    • 소소한 코딩일지
  • 블로그 메뉴

    • 방명록
    • 분류 전체보기 (181)
      • 🚩 목표 & 회고 (9)
      • 📓 Papers (10)
      • 🧇 Algorithm (44)
        • 이론 (1)
        • LeetCode (2)
        • 프로그래머스 (30)
        • 백준 (11)
      • 💻 Study (47)
        • 🤖 AI 인공지능 (3)
        • Python 파이썬 (3)
        • Docker 도커 (4)
        • 웹 (20)
        • 안드로이드 (2)
        • JAVA 자바 (1)
        • Firebase (3)
        • Linux 리눅스 (10)
      • 🍪 Projects (2)
      • 🎒 학교 (44)
        • 대학원 도비 (2)
        • 21 동계 모각코: 슈붕팥붕 (13)
        • 21 하계 모각코: 와팬호 (13)
        • 20 동계 모각코: 와팬호 (13)
      • 활동들 (16)
        • 인프런 대학생 LEAF 2기 (9)
        • 2021 Silicon Valley Online .. (7)
  • 태그

    Ai
    리액트
    Gentoo
    Python
    알고리즘스터디
    목표
    Linux
    백준
    React
    programmers
    코딩테스트
    Artificial Intelligence
    프로그래머스
    error
    모각코
    Algorithm
    알고리즘
    공부
    노마드코더
    인프런대학생Leaf
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
soyang.
[인프런 리프 2기] 6. 파이썬 병행성
상단으로

티스토리툴바