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

文脈自由文法の話
文脈自由文法の話文脈自由文法の話
文脈自由文法の話kogecoo
 
実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだこと実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだことnishio
 
Suphx: Mastering Mahjong with Deep Reinforcement Learning
Suphx: Mastering Mahjong with Deep Reinforcement LearningSuphx: Mastering Mahjong with Deep Reinforcement Learning
Suphx: Mastering Mahjong with Deep Reinforcement Learningharmonylab
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
GA로 게임 로그 분석하기
GA로 게임 로그 분석하기GA로 게임 로그 분석하기
GA로 게임 로그 분석하기Alan Kang
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
PythonとQGISで簡単処理
PythonとQGISで簡単処理PythonとQGISで簡単処理
PythonとQGISで簡単処理Kazutaka ishizaki
 
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) 오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) Yongho Ha
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介Preferred Networks
 
[DL輪読会]Meta Reinforcement Learning
[DL輪読会]Meta Reinforcement Learning[DL輪読会]Meta Reinforcement Learning
[DL輪読会]Meta Reinforcement LearningDeep Learning JP
 
RでGARCHモデル - TokyoR #21
RでGARCHモデル - TokyoR #21RでGARCHモデル - TokyoR #21
RでGARCHモデル - TokyoR #21horihorio
 
LiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングLiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングTakuya Minagawa
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化Akiyoshi Hara
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기MinGeun Park
 
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】Naoki Hayashi
 
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)Minho Lee
 

What's hot (20)

文脈自由文法の話
文脈自由文法の話文脈自由文法の話
文脈自由文法の話
 
実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだこと実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだこと
 
Suphx: Mastering Mahjong with Deep Reinforcement Learning
Suphx: Mastering Mahjong with Deep Reinforcement LearningSuphx: Mastering Mahjong with Deep Reinforcement Learning
Suphx: Mastering Mahjong with Deep Reinforcement Learning
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
GA로 게임 로그 분석하기
GA로 게임 로그 분석하기GA로 게임 로그 분석하기
GA로 게임 로그 분석하기
 
llvm入門
llvm入門llvm入門
llvm入門
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
PythonとQGISで簡単処理
PythonとQGISで簡単処理PythonとQGISで簡単処理
PythonとQGISで簡単処理
 
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA) 오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
오늘 밤부터 쓰는 google analytics (구글 애널리틱스, GA)
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 
[DL輪読会]Meta Reinforcement Learning
[DL輪読会]Meta Reinforcement Learning[DL輪読会]Meta Reinforcement Learning
[DL輪読会]Meta Reinforcement Learning
 
RでGARCHモデル - TokyoR #21
RでGARCHモデル - TokyoR #21RでGARCHモデル - TokyoR #21
RでGARCHモデル - TokyoR #21
 
LiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピングLiDAR点群と画像とのマッピング
LiDAR点群と画像とのマッピング
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化
劣モジュラ最適化と機械学習 2.0-2.3 劣モジュラ関数の基本性質・例・最適化
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】
【招待講演】パラメータ制約付き行列分解のベイズ汎化誤差解析【StatsML若手シンポ2020】
 
PyCUDAの紹介
PyCUDAの紹介PyCUDAの紹介
PyCUDAの紹介
 
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)
A/B 테스트를 적용하기 어려울 때, 이벤트 효과 추정하기 (2020-01-18 잔디콘)
 

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
 
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문익 장
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow양 한빛
 

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
 
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
 
개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow개발자를 위한 공감세미나 tensor-flow
개발자를 위한 공감세미나 tensor-flow
 

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
 
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019Kenneth 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 (15)

이미지 프로세싱 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
 
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
AI 연구자를 위한 클린코드 - GDG DevFest Seoul 2019
 
하둡 에코시스템 위에서 환상적인 테이크오프 - 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