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

게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스Seungmo Koo
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들Jubok Kim
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법ChangHyun Won
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011devCAT Studio, NEXON
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012devCAT Studio, NEXON
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015devCAT Studio, NEXON
 
マルチスレッドRxSwift @ 社内RxSwift勉強会
マルチスレッドRxSwift @ 社内RxSwift勉強会マルチスレッドRxSwift @ 社内RxSwift勉強会
マルチスレッドRxSwift @ 社内RxSwift勉強会Yuki Takahashi
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ株式会社サードウェア
 
自己紹介LT(公開版)
自己紹介LT(公開版)自己紹介LT(公開版)
自己紹介LT(公開版)Ken Muryoi
 
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법강 민우
 
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011devCAT Studio, NEXON
 
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社Game Tools & Middleware Forum
 
마이너리티 아레나 기본 전투 시스템 기획서
마이너리티 아레나 기본 전투 시스템 기획서마이너리티 아레나 기본 전투 시스템 기획서
마이너리티 아레나 기본 전투 시스템 기획서Nawe1
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017devCAT Studio, NEXON
 
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기강 민우
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기MinGeun Park
 
Raspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すRaspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すKenichiro MATOHARA
 
기획자의 포트폴리오는 어떻게 써야 할까
기획자의 포트폴리오는 어떻게 써야 할까기획자의 포트폴리오는 어떻게 써야 할까
기획자의 포트폴리오는 어떻게 써야 할까Han Je Sung
 

What's hot (20)

게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스게임제작개론 : #8 게임 제작 프로세스
게임제작개론 : #8 게임 제작 프로세스
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들
 
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
NDC2013 - 인디게임 프로젝트 중도에 포기하지 않는 방법
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
 
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 
Wireguard 実践入門
Wireguard 実践入門Wireguard 実践入門
Wireguard 実践入門
 
マルチスレッドRxSwift @ 社内RxSwift勉強会
マルチスレッドRxSwift @ 社内RxSwift勉強会マルチスレッドRxSwift @ 社内RxSwift勉強会
マルチスレッドRxSwift @ 社内RxSwift勉強会
 
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタDRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
DRBD/Heartbeat/Pacemakerで作るKVM仮想化クラスタ
 
自己紹介LT(公開版)
自己紹介LT(公開版)自己紹介LT(公開版)
自己紹介LT(公開版)
 
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
 
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
이원, 절차적 지형 생성과 하이트필드의 사원, NDC2011
 
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
 
마이너리티 아레나 기본 전투 시스템 기획서
마이너리티 아레나 기본 전투 시스템 기획서마이너리티 아레나 기본 전투 시스템 기획서
마이너리티 아레나 기본 전투 시스템 기획서
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
 
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기
[IGC2015] 마프게임즈 김동준-대기업의 틈바구니에서 인디게임으로 살아남기
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 
Raspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試すRaspberry PiのUSB OTGを試す
Raspberry PiのUSB OTGを試す
 
기획자의 포트폴리오는 어떻게 써야 할까
기획자의 포트폴리오는 어떻게 써야 할까기획자의 포트폴리오는 어떻게 써야 할까
기획자의 포트폴리오는 어떻게 써야 할까
 

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