더 많은 샘플코드는 아래 주소에서 보실 수 있습니다.
https://github.com/KennethanCeyer/pycon-kr-2017/blob/master/README-KR.md
파이썬으로 개발을 진행할 때
메모리가 넘쳐흐르거나 프로세스 진행 순서가 엉망인 경험 없으세요?
리액티브 프로그래밍은 복잡한 데이터 흐름을 새로운 관점에서 쉽게 정의하고 재활용 할 수 있도록 도와줍니다.
또한 제너레이터와 코루틴은 거대한 데이터 스트림을 가볍게 하이파이브하며 여러분이 원하는대로 처리해줄 수 있게 설계되어 있습니다. 물론 처리시간도 늘어나지 않으면서요!
다가오는 파이콘 한국 2017, 13일 일요일 점심에 여러분에게 앞서 말한 기능을 이용하여 여러분의 코드를 조금 더 효율적으로 짜실 수 있는 노하우를 공유드리고자 합니다.
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
23. Use Case
CH 3. 코루틴 / 제너레이터
Init Data
호출자 코루틴
2. yield를 통해 호출자의 입력을 기다림
(호출자 코드로 돌아감)
1. 코루틴에 적용할 초기 데이터 삽입
3. 호출자에게 입력을 받았다면
코루틴 코드로 돌아와서 로직 실행.
로직중 yield가 나타나면 다시 부모 코드로 돌아감
(반복)
next()
Yield
Yield
4. 마지막으로 호출자에서 코루틴을 종료시킴.Close
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. 코루틴 / 제너레이터
실시간으로 들어오는 데이터는
제너레이터를 사용하면
메모리를 안정적으로 운영 가능!
(성능이 크게 차이나지 않음)