'공부 기록' 카테고리의 글 목록
본문 바로가기

공부 기록

(30)
병렬성 (Parallelism) - Futures 2 Futures 2가지 패턴 실습 concurrent.futures map concurrent.futures wait, as_completed wait 패턴 def main(): # Worker Count worker = min(10, len(WORK_LIST)) # 시작 시간 start_tm = time.time() # futures futures_list = [] # 결과 건수 # ProcessPoolExecutor with ProcessPoolExecutor() as executor: for work in WORK_LIST: # future 반환 future = executor.submit(sum_generator, work) # 스케쥴링 futures_list.append(future) # 스케쥴링..
병렬성 (Parallelism) - Futures Future 동시성 비동기 작업 실행 지연시간 (Block) CPU 및 리소스 낭비 방지 -> (File) Network I/O 관련 작업 -> 동시성 활용 권장 비동기 작업과 적합한 프로그램일 경우 압도적으로 성능 향상 futures 비동기 실행을 위한 API를 고수준으로 작성 -> 사용하기 쉽도록 개선 concurrent.futures 1. 멀티스레딩/멀티프로세싱 API 통일 -> 사용하기 매우 쉬움 2. 실행 중인 작업 취소, 완료 여부 체크, 타임아웃 옵션, 콜백 추가, 동기화 코드 매우 쉽게 작성 -> Promise 개념 GIL (Global Interpreter Lock) : 두 개 이상의 스레드가 동시에 실행될 때 하나의 자원을 엑세스 하는 경우의 문제점을 방지하기 위해 GIL 실행, 리소스..
병행성 (Concurrency) - 코루틴 (Coroutine), yield 코루틴 단일(싱글) 스레드, 스택을 기반으로 동작하는 비동기 작업 루틴 실행 중 중지 -> 동시성 프로그래밍 스레드에 비해 오버헤드 감소 스레드 OS에서 관리, CPU 코어에서 실시간, 사분할 비동기 작업 -> 멀티 스레드 멀티 스레드는 싱글 스레드보다 복잡 -> 공유되는 자원 -> 교착상태 발생 가능성, 컨택스트 스위칭 비용 발생, 자원 소비 가능성 증가 yield, send 메인 루틴과 서브루틴 간의 정보 양방향 전송 코루틴 제어, 상태 서브루틴 메인 루틴에서 호출 -> 서브루틴에서 수행 (흐름 제어) Python 3.5부터 def -> async, yield -> await로 대체 가능 코루틴 Ex1 def coroutine1(): print('>>> coroutine started') i = yi..
병행성 (Concurrency) - 제너레이터 (Generator) 병행성 (Concurrency) : 한 컴퓨터가 여러 일을 동시에 수행 -> 단일 프로그램 안에서 여러 일을 쉽게 해결 병렬성 (Parallelism) : 여러 컴퓨터가 여러 작업을 동시에 수행 -> 속도 Generator Ex def generator_ex1(): print('Start') yield 'A Point' print('Continue') yield 'B Point' print('End') temp = iter(generator_ex1()) # print(temp) # print(next(temp)) # print(next(temp)) # print(next(temp)) for v in generator_ex1(): pass # print(v) # Generator Ex2 temp2 = [x..
병행성 (Concurrency) - 기본 병행성 (Concurrency) 이터레이터 (Iterator), 제네레이터 (Generator) 파이썬 반복 가능한 타입 (iterable) : collections, text, List, Dict, Set, Tuple, unpacking, *args... 반복 가능한 이유 -> 내부적으로 iter(x) 함수 호출 t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for c in t: pass # print(c) # while w = iter(t) while True: try: print(next(w)) except StopIteration: break # 반복형 확인 from collections import abc # print(dir(t)) print(hasattr(t, '__iter__'..
데코레이터 (Decorator) 데코레이터 (Decorator) 장점 1. 중복 제거, 코드 간결, 공통 함수 작성 2. 로깅, 프레임워크, 유효성 체크 -> 공통 기능 3. 조합해서 사용 용이 단점 1. 가독성 감소 2. 특정 기능에 한정된 함수 -> 단일 함수로 작성하는 것이 유리 3. 디버깅 불편 데코레이터 실습 import time def perf_clock(func): def perf_clocked(*args): # 함수 시작 시간 st = time.perf_counter() # 함수 실행 result = func(*args) # 함수 종료 시간 et = time.perf_counter() - st # 실행 함수명 name = func.__name__ # 함수 매개변수 arg_str = ', '.join(repr(arg) fo..
클로저 (Closure) 심화 클로저 심화 # 외부에서 호출된 함수의 변수값, 상태 (래퍼런스) 복사 후 저장 -> 후에 접근 (엑세스) 가능 # Closure 사용 def closure_ex1(): # Free variable # 쿨로저 영역 series = [] def averager(v): series.append(v) print('inner >>> {} / {}'.format(series, len(series))) return sum(series) / len(series) return averager avg_closure1 = closure_ex1() print(avg_closure1(10)) print(avg_closure1(30)) print(avg_closure1(50)) # function inspection print..
클로저 (Closure) 기초 클로저 기초 # 파이썬 변수 범위 (scope) # Ex1 def func_v1(a): print(a) print(b) # func_v1(10) # Ex2 b = 20 def func_v2(a): print(a) print(b) func_v2(10) # Ex3 c = 30 def func_v3(a): global c print(a) print(c) c = 40 print('>>', c) func_v3(10) print('>>>', c) Closure (클로저) 사용 이유 서버 프로그래밍 -> 동시성 (Concurrency) 제어 -> 메모리 공간에 여러 자원이 접근 -> 교착상태 (Dead Lock) 메모리를 공유하지 않고 메시지 전달로 처리하기 위한 -> Erlang 클로저는 공유하되 변경되지 않는 (..