SlideShare a Scribd company logo
1 of 32
Download to read offline
파이썬 리액티브하게 짜기
PyCon Korea 2017
한성민
SPEAKER
편집자
개발팀장
한성민
INTRODUCTION
리액티브 프로그래밍
RxPy
코루틴 / 제너레이터
CH1.
CH2.
CH3.
CH1.
리액티브 프로그래밍
What is reactive programming?
CH 1. 리액티브 프로그래밍
비동기 데이터 흐름에 초점을 맞춘
새로운 패러다임
어렵잖아
핵심 키워드 #1
CH 1. 리액티브 프로그래밍
비동기
동기화가 보장되지 않은 데이터를 순차적으로 받아들일 수 있으며
이렇게 받아들인 데이터를 유연하게 처리한다.
핵심 키워드 #2
CH 1. 리액티브 프로그래밍
반응형
외부에서 어떠한 동작(입력)이 없다면 실행되지 않는다.
핵심 키워드 #3
CH 1. 리액티브 프로그래밍
경량
데이터 흐름은 각 목적에 맞도록 작게 나눌 수 있으며
작게 나눈 것을 다시 합칠 수 있다.
이를 통해 경량화가 가능하다.
데이터는 흐릅니다.
CH 1. 리액티브 프로그래밍
항상 같은 시간에 흐르지는 않습니다.
데이터가 계속 온다고 보장할 수 없습니다.
CH 1. 리액티브 프로그래밍
이런 서로 다른 시간대의
데이터를 처리하는 것은 결코 쉽지 않습니다.
CH 1. 리액티브 프로그래밍
.next() .subscribe()
여러 데이터 흐름을 제어해주는 것
리액티브 프로그래밍은 그것을 가능하게 합니다.
CH 1. 리액티브 프로그래밍
서로 다른 시간대에서 병렬(Concurrency)로 오는 데이터들을
순차적으로 (Sequential)
데이터 흐름만을 봅니다.
따라서 보다 직관적입니다.
CH 1. 리액티브 프로그래밍
Map
Filter
Merge Reduce
(정제)
(변환)
(병합) (건너뛰기) (합산)
On Complete
On Error
Retry
(재시도)
Skip
(모아두기)
Buffer
CH2.
RxPy
ReactiveX (RX)
CH 2. RxPy
Microsoft 2007년 `Volta` 프로젝트 발표
2009년 `Reactive Extensions` 이름으로 공개
2012년 부터 점차적으로 오픈소스로 공개
def observer_generator(observer):
# 옵저버를 통해 “hello” 문자열을 전달합니다.
observer.on_next("hello")
# 마찬가지로 옵저버를 통해 “world!” 문자열을 전달합니다.
observer.on_next("world!")
def main():
# 옵저버를 생성하여 미리 정의한 함수에 전달하고 이를 수신할 수 있는 객체를 받습니다.
observable = Observable.create(observer_generator)
# 옵저버를 수신합니다, 이때에는 on_next로 전달된 변수를 읽어 출력하게 합니다.
# 아참! 그리고 아래의 subscribe가 시작되고나서 위쪽의 observer_generator가 실행됩니다.
observable.subscribe(on_next=lambda value: print(value))
hello_world.py
observable.create (옵저버 생성)
observer_generator
observer
def observer_generator(observer):
# 옵저버를 통해 “hello” 문자열을 전달합니다.
observer.on_next("hello")
# 마찬가지로 옵저버를 통해 “world!” 문자열을 전달합니다.
observer.on_next("world!")
def main():
# 옵저버를 생성하여 미리 정의한 함수에 전달하고 이를 수신할 수 있는 객체를 받습니다.
observable = Observable.create(observer_generator)
# 옵저버를 수신합니다, 이때에는 on_next로 전달된 변수를 읽어 출력하게 합니다.
# 아참! 그리고 아래의 subscribe가 시작되고나서 위쪽의 observer_generator가 실행됩니다.
observable.subscribe(on_next=lambda value: print(value))
hello_world.py
observable
1. next(‘hello’)
2. next(‘world!’)
observer
1. print(‘hello’)
2. print(‘world!’)
on_next를 통해 데이터 전달
on_next로 들어온 데이터 출력
from rx import Observable, Observer
class PrintObserver(Observer):
def on_next(self, value):
print('on_next value:%s’ % (value))
def on_completed(self):
print('on_completed !')
def on_error(self, value):
print('on_error value:%s’ % (value))
def observer_generator(observer):
observer.on_next(“break")
observer.on_next(“the ice!")
while True:
message = input()
if message:
observer.on_next(message)
else:
observer.on_completed()
break
def main():
observable = Observable.create(observer_generator)
observable.subscribe(PrintObserver())
ice_breaking.py
Observable
(데이터 전달자)
Observable
(데이터 수신자)
subscribe()
next(‘break’)
next(‘the ice!’)
next(‘message’)
print()
print()
print()
on_next
on_next
on_next
completed()
on_completed print()
1. subscribe에 미리 정의한 객체를 이용해서
수신 메시지를 확장하실 수 있습니다.
CH3.
코루틴 / 제너레이터
코루틴 (Coroutine)?
CH 3. 코루틴 / 제너레이터
일반적으로 함수와 달리
함수를 호출한 부모와 호출된 함수가
“동등한 관계”에 있는 루틴
파이썬 한정: 코루틴은 입력받아 처리하는 루틴
코루틴과 일반함수 비교
CH 3. 코루틴 / 제너레이터
일반함수
함수호출
(Call)
결과반환
(Return)
Parameters
Result
코루틴
함수
함수호출
(Call)
Parameters
Yield
Yield
Yield
메인코드 메인코드
호출자 연산
호출자 연산
호출자 연산
Send
Send
Send
Use Case
CH 3. 코루틴 / 제너레이터
Init Data
호출자 코루틴
2. yield를 통해 호출자의 입력을 기다림
(호출자 코드로 돌아감)
1. 코루틴에 적용할 초기 데이터 삽입
3. 호출자에게 입력을 받았다면
코루틴 코드로 돌아와서 로직 실행.
로직중 yield가 나타나면 다시 부모 코드로 돌아감
(반복)
next()
Yield
Yield
4. 마지막으로 호출자에서 코루틴을 종료시킴.Close
제너레이터 (Generator)?
CH 3. 코루틴 / 제너레이터
코루틴이 대식가라면
제너레이터는 아낌없이 주는 나무
yield를 통해
데이터 생성하는 생성체
range 함수를 아세요?
CH 3. 코루틴 / 제너레이터
def main():
# range 함수를 이용하여
# value에 0부터 2까지 각각의 값을 삽입하며 3번 반복합니다.
for value in range(3):
print(u’current value %d' % (value))
OUTPUT:
current_value 0
current_value 1
current_value 2
range 함수 제너레이터로 구현하기
CH 3. 코루틴 / 제너레이터
# 제너레이터로 만들어진 range 함수입니다!
def custom_range(number):
index = 0
while(index < number):
# 우리는 이때 이 함수를 호출한 부모로 돌아가 값을 전달하고,
# 이 함수를 다시 호출하기 전까지 부모의 로직을 진행합니다.
# 이것이 제너레이터의 핵심입니다. 기억하세요!
yield index
index += 1
coroutine_generator.py
def main():
# 기존의 range 함수를 사용해봅시다.
for value in range(3):
print(u'original range %d' % (value))
# 구분을 위해 한칸을 띄워줍시다.
print(u'n')
# 우리가 방금전에 만든 함수를 사용해봅시다.
for value in custom_range(3):
print(u'custom range %d' % (value))
OUTPUT
original range 0
original range 1
original range 2
custom range 0
custom range 1
custom range 2
Use Case
CH 3. 코루틴 / 제너레이터
Large Data
Memory
Process
yield
1. 실시간으로 읽어들이는 커서에서
데이터셋이 500개가 쌓일 때마다
yield return
2. 실제로 메모리에는 500개 데이터뿐이니
메모리 부족 문제는 없음
3. 500개의 데이터를 가공하고
Process가 끝나면
500개 데이터를 메모리에서 비움
마찬가지로 메모리 부족 문제 없음
4. Process가 끝나면
다시 Large Data에서 500개의
데이터를 가져옴.
제너레이터 결론
CH 3. 코루틴 / 제너레이터
실시간으로 들어오는 데이터는
제너레이터를 사용하면
메모리를 안정적으로 운영 가능!
(성능이 크게 차이나지 않음)
코루틴과 제너레이터 차이가 뭐에요?
CH 3. 코루틴 / 제너레이터
코루틴
함수
함수호출
(Call)
Parameters
Yield
Yield
Yield
메인코드
호출자 연산
호출자 연산
호출자 연산
Send
Send
제너레이터
함수호출
(Call)
Parameters
Yield
Yield
Yield
메인코드
호출자 연산
호출자 연산
호출자 연산
Return
Return
Return
Send
Question
수고하셨습니다.
Kennethan@nhpcw.com
http://github.com/KennethanCeyer/pycon-kr-2017
Email
GitHub

More Related Content

What's hot

AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019Kenneth Ceyer
 
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?Yongho Ha
 
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SFInsuk (Chris) Cho
 
2014년 안전행정부 업무보고
2014년 안전행정부 업무보고2014년 안전행정부 업무보고
2014년 안전행정부 업무보고SijunPark4
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁Yi-kwon Hwang
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또Seongyun Byeon
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 introSeongyun Byeon
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
서비스 기획자를 위한 데이터분석 시작하기
서비스 기획자를 위한 데이터분석 시작하기서비스 기획자를 위한 데이터분석 시작하기
서비스 기획자를 위한 데이터분석 시작하기승화 양
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
The Value Proposition Canvas 워크샵 강의안
The Value Proposition Canvas 워크샵 강의안The Value Proposition Canvas 워크샵 강의안
The Value Proposition Canvas 워크샵 강의안Jung Soo Kim
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Seongyun Byeon
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
2022 경희대학교 테크콘서트
2022 경희대학교 테크콘서트2022 경희대학교 테크콘서트
2022 경희대학교 테크콘서트JongyoonJeong1
 
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) 오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) Yongho Ha
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기NAVER D2
 

What's hot (20)

AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
 
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?
빅데이터, 클라우드, IoT, 머신러닝. 왜 이렇게 많은 것들이 나타날까?
 
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF
[Springcamp 2017] Build the RIGHT thing - 린 & 애자일 이야기 @ Pivotal Labs SF
 
2014년 안전행정부 업무보고
2014년 안전행정부 업무보고2014년 안전행정부 업무보고
2014년 안전행정부 업무보고
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또글쓰는 개발자 모임, 글또
글쓰는 개발자 모임, 글또
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
서비스 기획자를 위한 데이터분석 시작하기
서비스 기획자를 위한 데이터분석 시작하기서비스 기획자를 위한 데이터분석 시작하기
서비스 기획자를 위한 데이터분석 시작하기
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
The Value Proposition Canvas 워크샵 강의안
The Value Proposition Canvas 워크샵 강의안The Value Proposition Canvas 워크샵 강의안
The Value Proposition Canvas 워크샵 강의안
 
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라Little Big Data #1. 바닥부터 시작하는 데이터 인프라
Little Big Data #1. 바닥부터 시작하는 데이터 인프라
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
2022 경희대학교 테크콘서트
2022 경희대학교 테크콘서트2022 경희대학교 테크콘서트
2022 경희대학교 테크콘서트
 
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) 오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 

Similar to 파이썬 리액티브하게 짜기 - PyCon Korea 2017

React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.병대 손
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니Lusain Kim
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815Yong Joon Moon
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍Hyunsoo Jung
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow InternalsKiho Hong
 
Howto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHowto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHyo jeong Lee
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
Malzilla tutorial2
Malzilla tutorial2Malzilla tutorial2
Malzilla tutorial2re4lfl0w
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수유진 변
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장SukYun Yoon
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)Lee Seungeun
 
Seed2016 - 개미수열 한주영 (annotated)
Seed2016 - 개미수열 한주영 (annotated)Seed2016 - 개미수열 한주영 (annotated)
Seed2016 - 개미수열 한주영 (annotated)Jooyung Han
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2문익 장
 

Similar to 파이썬 리액티브하게 짜기 - PyCon Korea 2017 (20)

React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
React 애플리케이션 아키텍처 - 아무도 알려주지 않아서 혼자서 삽질했다.
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 
C++에서 Objective-C까지
C++에서 Objective-C까지C++에서 Objective-C까지
C++에서 Objective-C까지
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow Internals
 
Howto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear RegressionHowto_Tensorflow+Linear Regression
Howto_Tensorflow+Linear Regression
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
Malzilla tutorial2
Malzilla tutorial2Malzilla tutorial2
Malzilla tutorial2
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
자바스크립트 함수
자바스크립트 함수자바스크립트 함수
자바스크립트 함수
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
Mt
MtMt
Mt
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
 
Seed2016 - 개미수열 한주영 (annotated)
Seed2016 - 개미수열 한주영 (annotated)Seed2016 - 개미수열 한주영 (annotated)
Seed2016 - 개미수열 한주영 (annotated)
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 

More from Kenneth Ceyer

이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020Kenneth Ceyer
 
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.Kenneth Ceyer
 
LP(linear programming) Algorithm
LP(linear programming) AlgorithmLP(linear programming) Algorithm
LP(linear programming) AlgorithmKenneth Ceyer
 
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019 하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019 Kenneth Ceyer
 
AllReduce for distributed learning I/O Extended Seoul
AllReduce for distributed learning I/O Extended SeoulAllReduce for distributed learning I/O Extended Seoul
AllReduce for distributed learning I/O Extended SeoulKenneth Ceyer
 
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019Kenneth Ceyer
 
Test and refactoring
Test and refactoringTest and refactoring
Test and refactoringKenneth Ceyer
 
Deep dive into Modern frameworks - HTML5 Forum 2018
Deep dive into Modern frameworks - HTML5 Forum 2018Deep dive into Modern frameworks - HTML5 Forum 2018
Deep dive into Modern frameworks - HTML5 Forum 2018Kenneth Ceyer
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018Kenneth Ceyer
 
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기Kenneth Ceyer
 
엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화Kenneth Ceyer
 
Dealing with Python Reactively - PyCon Korea 2017
Dealing with Python Reactively - PyCon Korea 2017Dealing with Python Reactively - PyCon Korea 2017
Dealing with Python Reactively - PyCon Korea 2017Kenneth Ceyer
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSKenneth Ceyer
 

More from Kenneth Ceyer (14)

이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
이미지 프로세싱 in Python Open Source - PYCON KOREA 2020
 
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.
정적 컨텐츠 제너레이터 GatsbyJS에 대해서 알아봅시다.
 
LP(linear programming) Algorithm
LP(linear programming) AlgorithmLP(linear programming) Algorithm
LP(linear programming) Algorithm
 
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019 하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019
하둡 에코시스템 위에서 환상적인 테이크오프 - DSTS 2019
 
AllReduce for distributed learning I/O Extended Seoul
AllReduce for distributed learning I/O Extended SeoulAllReduce for distributed learning I/O Extended Seoul
AllReduce for distributed learning I/O Extended Seoul
 
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019
gRPC와 goroutine 톺아보기 - GDG Golang Korea 2019
 
How to use vim
How to use vimHow to use vim
How to use vim
 
Test and refactoring
Test and refactoringTest and refactoring
Test and refactoring
 
Deep dive into Modern frameworks - HTML5 Forum 2018
Deep dive into Modern frameworks - HTML5 Forum 2018Deep dive into Modern frameworks - HTML5 Forum 2018
Deep dive into Modern frameworks - HTML5 Forum 2018
 
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
우아하게 준비하는 테스트와 리팩토링 - PyCon Korea 2018
 
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기 GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
GDG DevFest 2017 Seoul 프론트엔드 모던 프레임워크 낱낱히 파헤치기
 
엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화엔지니어 관점에서 바라본 데이터시각화
엔지니어 관점에서 바라본 데이터시각화
 
Dealing with Python Reactively - PyCon Korea 2017
Dealing with Python Reactively - PyCon Korea 2017Dealing with Python Reactively - PyCon Korea 2017
Dealing with Python Reactively - PyCon Korea 2017
 
AngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJSAngularJS 2, version 1 and ReactJS
AngularJS 2, version 1 and ReactJS
 

파이썬 리액티브하게 짜기 - PyCon Korea 2017

  • 5. What is reactive programming? CH 1. 리액티브 프로그래밍 비동기 데이터 흐름에 초점을 맞춘 새로운 패러다임
  • 7. 핵심 키워드 #1 CH 1. 리액티브 프로그래밍 비동기 동기화가 보장되지 않은 데이터를 순차적으로 받아들일 수 있으며 이렇게 받아들인 데이터를 유연하게 처리한다.
  • 8. 핵심 키워드 #2 CH 1. 리액티브 프로그래밍 반응형 외부에서 어떠한 동작(입력)이 없다면 실행되지 않는다.
  • 9. 핵심 키워드 #3 CH 1. 리액티브 프로그래밍 경량 데이터 흐름은 각 목적에 맞도록 작게 나눌 수 있으며 작게 나눈 것을 다시 합칠 수 있다. 이를 통해 경량화가 가능하다.
  • 10. 데이터는 흐릅니다. CH 1. 리액티브 프로그래밍
  • 11. 항상 같은 시간에 흐르지는 않습니다. 데이터가 계속 온다고 보장할 수 없습니다. CH 1. 리액티브 프로그래밍
  • 12. 이런 서로 다른 시간대의 데이터를 처리하는 것은 결코 쉽지 않습니다. CH 1. 리액티브 프로그래밍 .next() .subscribe()
  • 13. 여러 데이터 흐름을 제어해주는 것 리액티브 프로그래밍은 그것을 가능하게 합니다. CH 1. 리액티브 프로그래밍 서로 다른 시간대에서 병렬(Concurrency)로 오는 데이터들을 순차적으로 (Sequential)
  • 14. 데이터 흐름만을 봅니다. 따라서 보다 직관적입니다. CH 1. 리액티브 프로그래밍 Map Filter Merge Reduce (정제) (변환) (병합) (건너뛰기) (합산) On Complete On Error Retry (재시도) Skip (모아두기) Buffer
  • 16. ReactiveX (RX) CH 2. RxPy Microsoft 2007년 `Volta` 프로젝트 발표 2009년 `Reactive Extensions` 이름으로 공개 2012년 부터 점차적으로 오픈소스로 공개
  • 17. def observer_generator(observer): # 옵저버를 통해 “hello” 문자열을 전달합니다. observer.on_next("hello") # 마찬가지로 옵저버를 통해 “world!” 문자열을 전달합니다. observer.on_next("world!") def main(): # 옵저버를 생성하여 미리 정의한 함수에 전달하고 이를 수신할 수 있는 객체를 받습니다. observable = Observable.create(observer_generator) # 옵저버를 수신합니다, 이때에는 on_next로 전달된 변수를 읽어 출력하게 합니다. # 아참! 그리고 아래의 subscribe가 시작되고나서 위쪽의 observer_generator가 실행됩니다. observable.subscribe(on_next=lambda value: print(value)) hello_world.py observable.create (옵저버 생성) observer_generator observer
  • 18. def observer_generator(observer): # 옵저버를 통해 “hello” 문자열을 전달합니다. observer.on_next("hello") # 마찬가지로 옵저버를 통해 “world!” 문자열을 전달합니다. observer.on_next("world!") def main(): # 옵저버를 생성하여 미리 정의한 함수에 전달하고 이를 수신할 수 있는 객체를 받습니다. observable = Observable.create(observer_generator) # 옵저버를 수신합니다, 이때에는 on_next로 전달된 변수를 읽어 출력하게 합니다. # 아참! 그리고 아래의 subscribe가 시작되고나서 위쪽의 observer_generator가 실행됩니다. observable.subscribe(on_next=lambda value: print(value)) hello_world.py observable 1. next(‘hello’) 2. next(‘world!’) observer 1. print(‘hello’) 2. print(‘world!’) on_next를 통해 데이터 전달 on_next로 들어온 데이터 출력
  • 19. from rx import Observable, Observer class PrintObserver(Observer): def on_next(self, value): print('on_next value:%s’ % (value)) def on_completed(self): print('on_completed !') def on_error(self, value): print('on_error value:%s’ % (value)) def observer_generator(observer): observer.on_next(“break") observer.on_next(“the ice!") while True: message = input() if message: observer.on_next(message) else: observer.on_completed() break def main(): observable = Observable.create(observer_generator) observable.subscribe(PrintObserver()) ice_breaking.py Observable (데이터 전달자) Observable (데이터 수신자) subscribe() next(‘break’) next(‘the ice!’) next(‘message’) print() print() print() on_next on_next on_next completed() on_completed print() 1. subscribe에 미리 정의한 객체를 이용해서 수신 메시지를 확장하실 수 있습니다.
  • 21. 코루틴 (Coroutine)? CH 3. 코루틴 / 제너레이터 일반적으로 함수와 달리 함수를 호출한 부모와 호출된 함수가 “동등한 관계”에 있는 루틴 파이썬 한정: 코루틴은 입력받아 처리하는 루틴
  • 22. 코루틴과 일반함수 비교 CH 3. 코루틴 / 제너레이터 일반함수 함수호출 (Call) 결과반환 (Return) Parameters Result 코루틴 함수 함수호출 (Call) Parameters Yield Yield Yield 메인코드 메인코드 호출자 연산 호출자 연산 호출자 연산 Send Send Send
  • 23. Use Case CH 3. 코루틴 / 제너레이터 Init Data 호출자 코루틴 2. yield를 통해 호출자의 입력을 기다림 (호출자 코드로 돌아감) 1. 코루틴에 적용할 초기 데이터 삽입 3. 호출자에게 입력을 받았다면 코루틴 코드로 돌아와서 로직 실행. 로직중 yield가 나타나면 다시 부모 코드로 돌아감 (반복) next() Yield Yield 4. 마지막으로 호출자에서 코루틴을 종료시킴.Close
  • 24. 제너레이터 (Generator)? CH 3. 코루틴 / 제너레이터 코루틴이 대식가라면 제너레이터는 아낌없이 주는 나무 yield를 통해 데이터 생성하는 생성체
  • 25. range 함수를 아세요? CH 3. 코루틴 / 제너레이터 def main(): # range 함수를 이용하여 # value에 0부터 2까지 각각의 값을 삽입하며 3번 반복합니다. for value in range(3): print(u’current value %d' % (value)) OUTPUT: current_value 0 current_value 1 current_value 2
  • 26. range 함수 제너레이터로 구현하기 CH 3. 코루틴 / 제너레이터 # 제너레이터로 만들어진 range 함수입니다! def custom_range(number): index = 0 while(index < number): # 우리는 이때 이 함수를 호출한 부모로 돌아가 값을 전달하고, # 이 함수를 다시 호출하기 전까지 부모의 로직을 진행합니다. # 이것이 제너레이터의 핵심입니다. 기억하세요! yield index index += 1
  • 27. coroutine_generator.py def main(): # 기존의 range 함수를 사용해봅시다. for value in range(3): print(u'original range %d' % (value)) # 구분을 위해 한칸을 띄워줍시다. print(u'n') # 우리가 방금전에 만든 함수를 사용해봅시다. for value in custom_range(3): print(u'custom range %d' % (value)) OUTPUT original range 0 original range 1 original range 2 custom range 0 custom range 1 custom range 2
  • 28. Use Case CH 3. 코루틴 / 제너레이터 Large Data Memory Process yield 1. 실시간으로 읽어들이는 커서에서 데이터셋이 500개가 쌓일 때마다 yield return 2. 실제로 메모리에는 500개 데이터뿐이니 메모리 부족 문제는 없음 3. 500개의 데이터를 가공하고 Process가 끝나면 500개 데이터를 메모리에서 비움 마찬가지로 메모리 부족 문제 없음 4. Process가 끝나면 다시 Large Data에서 500개의 데이터를 가져옴.
  • 29. 제너레이터 결론 CH 3. 코루틴 / 제너레이터 실시간으로 들어오는 데이터는 제너레이터를 사용하면 메모리를 안정적으로 운영 가능! (성능이 크게 차이나지 않음)
  • 30. 코루틴과 제너레이터 차이가 뭐에요? CH 3. 코루틴 / 제너레이터 코루틴 함수 함수호출 (Call) Parameters Yield Yield Yield 메인코드 호출자 연산 호출자 연산 호출자 연산 Send Send 제너레이터 함수호출 (Call) Parameters Yield Yield Yield 메인코드 호출자 연산 호출자 연산 호출자 연산 Return Return Return Send