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

Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話Takehiro Torigaki
 
スマートフォンゲームのチート事情
スマートフォンゲームのチート事情スマートフォンゲームのチート事情
スマートフォンゲームのチート事情直生 亀山
 
Introduction to YOLO detection model
Introduction to YOLO detection modelIntroduction to YOLO detection model
Introduction to YOLO detection modelWEBFARMER. ltd.
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法モノビット エンジン
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスターUnity Technologies Japan K.K.
 
120901fp key
120901fp key120901fp key
120901fp keyksknac
 
Live2Dライクなオープンソースソフトウェアの開発
Live2Dライクなオープンソースソフトウェアの開発Live2Dライクなオープンソースソフトウェアの開発
Live2Dライクなオープンソースソフトウェアの開発yuki540
 
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!モノビット エンジン
 
ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)Youichiro Miyake
 
CycleGANで顔写真をアニメ調に変換する
CycleGANで顔写真をアニメ調に変換するCycleGANで顔写真をアニメ調に変換する
CycleGANで顔写真をアニメ調に変換するmeownoisy
 
금융It시스템의 이해 1편 202201
금융It시스템의 이해 1편 202201금융It시스템의 이해 1편 202201
금융It시스템의 이해 1편 202201Seong-Bok Lee
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるKeiichi Sakai
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話Wooram Yang
 
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.Yongho Ha
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규ChangKyu Song
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-Takuya Akiba
 

What's hot (20)

Nginx Unitを試してみた話
Nginx Unitを試してみた話Nginx Unitを試してみた話
Nginx Unitを試してみた話
 
スマートフォンゲームのチート事情
スマートフォンゲームのチート事情スマートフォンゲームのチート事情
スマートフォンゲームのチート事情
 
Introduction to YOLO detection model
Introduction to YOLO detection modelIntroduction to YOLO detection model
Introduction to YOLO detection model
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
 
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター【Unity道場スペシャル 2017博多】クォータニオン完全マスター
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
 
120901fp key
120901fp key120901fp key
120901fp key
 
Live2Dライクなオープンソースソフトウェアの開発
Live2Dライクなオープンソースソフトウェアの開発Live2Dライクなオープンソースソフトウェアの開発
Live2Dライクなオープンソースソフトウェアの開発
 
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
UE4を使用したバーチャルヒューマンの映像制作  UNREAL FEST EXTREME 2021 SUMMERUE4を使用したバーチャルヒューマンの映像制作  UNREAL FEST EXTREME 2021 SUMMER
UE4を使用したバーチャルヒューマンの映像制作 UNREAL FEST EXTREME 2021 SUMMER
 
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!
【CEDEC2019 】5G時代に対応した『モノビットエンジン5G』を初公開! HoloLens対応した通信クラウド最新情報も!
 
ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)
 
CycleGANで顔写真をアニメ調に変換する
CycleGANで顔写真をアニメ調に変換するCycleGANで顔写真をアニメ調に変換する
CycleGANで顔写真をアニメ調に変換する
 
금융It시스템의 이해 1편 202201
금융It시스템의 이해 1편 202201금융It시스템의 이해 1편 202201
금융It시스템의 이해 1편 202201
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみる
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
乱択データ構造の最新事情 -MinHash と HyperLogLog の最近の進歩-
 

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