SlideShare a Scribd company logo
비동기 101
Basic of Asynchronous
첫 번째
이민철
IT Revolution
IC PC Internet Mobile
사용자의 증가 > 동시 접속자 증가
A. 연산을 더 빠르게
B. 동시성을 늘린다
사용자의 증가 > 동시 접속자 증가
A. 연산을 더 빠르게
1. 하드웨어 Upgrade
2. Low level Language
B. 동시성을 늘린다
1. Parallelism
2. Concurrency
사용자의 증가 > 동시 접속자 증가
A. 연산을 더 빠르게
1. 하드웨어 Upgrade
2. Low level Language
B. 동시성을 늘린다
1. Parallelism : 물리적인 level 에서 실제로 동시에 (병렬)처리
2. Concurrency : 논리적/software level에서 동시에 실행하는 것 처럼
사용자의 증가 > 동시 접속자 증가
A. 연산을 더 빠르게
1. 하드웨어 Upgrade ≒ more money
2. Low level Language
B. 동시성을 늘린다
1. Parallelism ≒ more money
2. Concurrency
Concurrency
• Thread
• Process
• Asynchronous
Thread and Process
Thread Process
Process 보다 적은 overhead 와 자원 사용 Thread 보다 더 많은 자원(cpu, memory ..) 사용
멀티코어 활용이 어려움 (concurrency) 멀티코어를 활용할 수 있음 (Parallelism)
Data 공유가 쉬움 Data 동기화가 어려움
공유 자원 접근의 위험성 (교착상태, 기아상태 …)
식사하는 철학자들 문제
다섯 명의 철학자가 원탁에 앉아 있고
• 철학자들은 생각하거나, 밥을 먹거나, 배가 고프거나 3가지 상
태를 가질 수 있다
• 각자의 앞에는 스파게티가 있고 양 옆에 포크가 하나씩 있다
• 각각의 철학자는 다른 철학자에게 말을 할 수 없다
• 철학자가 스파게티를 먹기 위해서는 양 옆의 포크를 동시에 들
어야 한다
식사하는 철학자들 문제
Solution 1
1. 왼쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능해
지면 집어 든다.
2. 오른쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능
해지면 집어 든다.
3. 양쪽의 포크를 잡으면 정해진 시간만큼 식사를 한다.
4. 오른쪽 포크를 내려놓는다.
5. 왼쪽 포크를 내려놓는다.
6. 다시 1번으로 돌아간다.
식사하는 철학자들 문제
Solution 1
동시에 왼쪽 포크를 모두 집어 들었다면?
계속 생각만 하는 상태에 빠지게 된다.
=> deadlock (교착상태) 발생!!
식사하는 철학자들 문제
Solution 2
1. 왼쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능해
지면 집어 든다.
2. 오른쪽 포크를 들 수 있나 보고 안되면 왼쪽 포크를 내려놓고 1번
으로 되돌아간다.
3. 양쪽의 포크를 잡으면 정해진 시간만큼 식사를 한다.
4. 오른쪽 포크를 내려놓는다.
5. 왼쪽 포크를 내려놓는다.
6. 다시 1번으로 돌아간다.
식사하는 철학자들 문제
Solution 2
동시에 왼쪽 포크를 모두 집어 들었다면?
행위를 반복하다 보면 적게 먹는 사람이 생긴다.
=> Thread간의 불균등한 자원 공유! (기아상태)
식사하는 철학자들 문제
How to solve it?
자원 관리를 위한 software 적인 안전장치와
동시성 프로그래밍에 대한 skill 이 필요함
=> 개발이 복잡하고 어려워 짐
Asynchronous 101 - (1)
식사하는 철학자들 문제
동시성 프로그래밍 (Concurrent Programming)
Coroutine
• 서브루틴 (sub routine)
반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것
우리에게 익숙한 이름! 함수, 메서드
• 코루틴 (coroutine)
루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시
원래 위치로 돌아와 나머지 루틴을 수행할 수 있다
???
Coroutine
Coroutine
• 서브루틴 (sub routine)
반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것
우리에게 익숙한 이름! 함수, 메서드
• 코루틴 (coroutine)
루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시
원래 위치로 돌아와 나머지 루틴을 수행할 수 있다
 비동기와 결합하면 더욱 강력해진다!
동기(Synchronous)와 비동기(Asynchronous)
• 동기: 시간 관계를 동시에 또는 동일하게 유지하는 처리 방식
(sync를 맞추다, 동기화 하다)
Ex: 대부분의 FPS 게임 – 유저 데이터의 시간 관계를 맞춰야 함
비디오와 자막의 싱크
• 비동기: sync를 맞추지 않아도 되는 처리 방식
(순차적이어도 되고 비순차적이어도 된다)
Ex: 듀랑고 – 비동기식으로 유저 데이터 수용
https://www.slideshare.net/sublee/spof-mmorpg
동기(Synchronous)와 비동기(Asynchronous)
• 어떠한 관점으로 보는가에 따라 다르게 해석할 수 있다
• 다양한 곳에서 동기와 비동기를 활용한다
[Serial 통신에서의 활용] [CPU 연산에서의 활용 (pipelining)]
동기식 프로그래밍, 비동기식 프로그래밍
• 프로그램 관점에서 본 동기, 비동기
• 서브루틴의 수행 시간을 기준으로
동기: 모든 루틴을 순차적으로 진행
비동기: 몇몇 루틴을 비순차적으로 진행할 수도 있음
Asynchronous in real life
동기식과 비동기식으로 빨래 돌리기
1. 세탁기 돌리기 (40분 소요)
2. 건조기 돌리기 (20분 소요)
3. 빨래 개기 (10분 소요)
동기식
execute washer execute dryer fold laundry
70 min
동기식: 3번의 빨래를 한다면?
execute washer execute dryer fold laundry execute washer execute dryer fold laundry
210 min
execute washer execute dryer fold laundry
비동기식: 3번의 빨래를 한다면
150 min
execute washer
execute dryer
fold laundry
execute washer
execute dryer
fold laundry
execute washer
execute dryer
fold laundry
비동기식: 3번의 빨래를 한다면
execute washer execute dryer fold laundryexecute washer execute dryer fold laundryexecute washer execute dryer fold laundry
150 min
건조기를 작동시키고 나서 바로 세탁기를 돌릴 수 있다
Asynchronous in software
Asynchronous 101 - (1)
So, How to make asynchronous program?
좋은 건 알겠는데..
프로세스를 비동기식으로 만들기 위해서는?
Non-block 의 등장
Block <-> Non-block
명확한 논리적 기준으로 구분 가능한 반대 개념
Block:
• 함수가 끝날 때 까지 기다린다.
• 함수의 결과를 return 한다.
Non block:
• 함수를 바로 return 한다.
• 함수의 결과를 따로 저장한다.
Non-block 의 등장
function
Main
wait
Main Non block
Object
function
return
is_finish
False
is_finish
result
True
빈 시간 동안 다른 작업을 할 수 있다
Run concurrency
Block Non block
Non-block 의 등장
논블록 함수의 결과를 얻으려면 언제 끝나는지 물어봐야 한다
언제 끝나는지 계속 물어보는 과정이 필요함
Event Loop!
Event Loop
• 외부 환경에서 이벤트를 받는다.
• 이벤트가 발생하면 해당 이벤트에 대한 루틴을 실행시킨다.
Non block + Event Loop => Async !
Non block 함수가 완료되었는지 아닌지를 검사하는 event loop
• 원시적인 asynchronous loop는 작업이 완료되었는지 아닌지를
event loop가 주기적으로 물어본다
• 더 효율적인 asynchronous loop는 어떤 작업의 상태가 바뀌었
는지를 select 한다
• 완전 효율적인 asynchronous loop는 작업의 상태가 바뀌면
event loop에게 알려준다 (커널의 도움이 필요함)
여러가지 I/O Multiplexing 기술들
Async
• 그럼 비동기 loop에 non block이 아닌 block 함수가 들어오면?
Block 함수가 실행되는 동안 event loop가 멈춘다!
성능의 저하 발생
• 가장 좋은 방법은 비동기 loop에서 non block 함수만 실행하는
것. 그러나 피치 못할 사정으로 block 함수를 실행해야 할 때가
있다.
Block 함수를 Thread나 Process로 concurrency 하게 실행해서 non block
처럼 만든다.
Async
[Node는 근본적으로 비동기로 설계되었다]
다시 shared data 접근의 위험 발생
• 여러 스레드가 같은 데이터를 참조 할 때
Thread1
Thread2
Thread3
프로세스의 흐름
data
도와줘요 코루틴
• 코루틴은 중간에 루틴을 중단했다 다시 시작할 수 있다.
• 코루틴을 어떻게 비동기로 동작 시킬 수 있을까
여러 개의 http 요청 보내기
• 한 개의 http 요청을 보내는 과정
1. http 프로토콜 형식에 맞게 문자열을 만든다.
2. 해당 문자열을 서버로 보낸다.
3. 서버한테 답장이 올 때 까지 기다린다.
4. 답장이 오면 결과를 저장한다.
여러 개의 http 요청 보내기
• 한 개의 http 요청을 보내는 과정
1. http 프로토콜 형식에 맞게 문자열을 만든다.
2. 해당 문자열을 서버로 보낸다.
3. 서버한테 답장이 올 때 까지 기다린다.
4. 답장이 오면 결과를 저장한다.
매우 적은 시간
많은 시간 소요
매우 적은 시간
여러 개의 http 요청 보내기
• 한 개의 http 요청을 보내는 과정
1. http 프로토콜 형식에 맞게 문자열을 만든다.
2. 해당 문자열을 서버로 보낸다.
3. 서버한테 답장이 올 때 까지 기다린다.
4. 답장이 오면 결과를 저장한다.
매우 적은 시간
많은 시간 소요
시간
중단 재개
Coroutine
매우 적은 시간
1 2 3 4
여러 개의 http 요청 보내기
시간
Coroutine
Single thread with Async Loop
Coroutine
Coroutine
Coroutine
Single thread with Async Loop
여러 개의 http 요청 보내기
시간
Coroutine + Async
• 동시성을(concurrent) 구현 But! Single thread
Single thread에서 실행되기 때문에 shared data 접근의 충돌의 걱정
이 아얘 사라짐!
동시성에 대한 안전장치를 만들지 않아도 되기때문에 코드 작성이 쉬움
개발 효율 증가
• 동시성이 있지만 또 다른 thread나 process를 만들 필요가 없음
메모리를 아낄 수 있음
Thread나 Process를 만드는 것에 대한 overhead가 없음. 시간 단축
Coroutine + Async
[동기식 서버와 비동기식 서버의 메모리 사용량]
Coroutine + Async
그러나 코루틴은 만병통치약이 아님
• 블록킹 함수 또는 CPU bound 작업을 할때 성능이 저하 됨
한 작업을 할 때에는 다른 작업을 처리할 수 없다.
블록킹 함수는 thread로 처리하자.
그 블록킹 함수가 shared data를 참조해야 하는 경우에는 결국 동시성
프로그래밍에 대한 지식과 software적 안전장치를 마련 해야함.
CPU bound? IO bound?
Bound: 밀접한 관계에 있는
• CPU bound: 연산이나 처리량이 많은 경우
ex) 문자열 연산, 사칙연산, 영상/이미지 처리
• IO bound: 입력과 출력이 많은 경우
• 보통 IO작업은 대기시간이 길고 CPU를 거의 사용하지 않는다
ex) file I/O, network I/O
언제 비동기를 써야 할까
• 처리 순서의 시간 관계가 관련이 없는 작업이 많을 때
• IO bound 작업이 많을 때
• 여러 개의 작업을 처리 해야 할 때
CPU bound 작업의 동시성은 어떻게 늘리나요?
CPU bound 작업의 동시성은 어떻게 늘리나요?
A. 연산을 더 빠르게
1. 하드웨어 Upgrade
2. Low level Language
B. 동시성을 늘린다
1. Parallelism
2. Concurrency
나머지 방안을 생각 하자
동기식 프로그래밍 with Python
[100개의 요청, 31 초 소요]
비동기식 프로그래밍 with Python
[100개의 요청, 0.4 초 소요]
다음 시간에는…
• 비동기식 처리를 어떻게 Programming Language 에서 표현할
수 있는가
• Python + 비동기

More Related Content

PDF
新浪微博Feed服务架构
XiaoJun Hong
 
PPT
DUG Integration step by step .ppt
wafawafa52
 
PDF
Optimizing Kubernetes Resource Requests/Limits for Cost-Efficiency and Latenc...
Henning Jacobs
 
PDF
F5 BigIP LTM Initial, Build, Install and Licensing.
Kapil Sabharwal
 
PPT
E nodeb useful commands for rf engineer
Vishal Padhya
 
PDF
Scalable webservice
DaeMyung Kang
 
PPTX
Managing 2000 Node Cluster with Ambari
DataWorks Summit
 
PPT
Lte most used command rev1
Christofer Dinamiko
 
新浪微博Feed服务架构
XiaoJun Hong
 
DUG Integration step by step .ppt
wafawafa52
 
Optimizing Kubernetes Resource Requests/Limits for Cost-Efficiency and Latenc...
Henning Jacobs
 
F5 BigIP LTM Initial, Build, Install and Licensing.
Kapil Sabharwal
 
E nodeb useful commands for rf engineer
Vishal Padhya
 
Scalable webservice
DaeMyung Kang
 
Managing 2000 Node Cluster with Ambari
DataWorks Summit
 
Lte most used command rev1
Christofer Dinamiko
 

Similar to Asynchronous 101 - (1) (20)

PPTX
Concurrent programming
Byeongsu Kang
 
PDF
More Effective Python 3st (Multitask)
경섭 심
 
PPTX
System+os study 3
J J
 
PDF
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
PDF
Concurreny programming
Jaejin Yun
 
PDF
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
Seomgi Han
 
PPTX
멸종하는 공룡이 되지 않으려면
Byeongsu Kang
 
PDF
오픈스택! 이틀이면할수있다! 시즌2
Nalee Jang
 
PPTX
Image Deep Learning 실무적용
Youngjae Kim
 
PDF
PHP로 Slack Bot 만들기
Changwan Jun
 
PDF
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
Dan Kang (강동한)
 
PPTX
배포
Woojing Seok
 
PPTX
Reduce testing time by Multiprocessing in python
SangJune Ahn
 
PDF
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
Youngmin Koo
 
PDF
Microsoft pp lpdf
HYUNWOO KIM
 
PDF
동시성 프로그래밍 하기 좋은 Clojure
Eunmin Kim
 
PPTX
MSA와 infra
Je Hun Kim
 
PDF
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
흥래 김
 
PPTX
서버 아키텍처 이해를 위한 프로세스와 쓰레드
KwangSeob Jeong
 
PDF
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
NAVER D2
 
Concurrent programming
Byeongsu Kang
 
More Effective Python 3st (Multitask)
경섭 심
 
System+os study 3
J J
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
Dong Chan Shin
 
Concurreny programming
Jaejin Yun
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
Seomgi Han
 
멸종하는 공룡이 되지 않으려면
Byeongsu Kang
 
오픈스택! 이틀이면할수있다! 시즌2
Nalee Jang
 
Image Deep Learning 실무적용
Youngjae Kim
 
PHP로 Slack Bot 만들기
Changwan Jun
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
Dan Kang (강동한)
 
배포
Woojing Seok
 
Reduce testing time by Multiprocessing in python
SangJune Ahn
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
Youngmin Koo
 
Microsoft pp lpdf
HYUNWOO KIM
 
동시성 프로그래밍 하기 좋은 Clojure
Eunmin Kim
 
MSA와 infra
Je Hun Kim
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
흥래 김
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
KwangSeob Jeong
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
NAVER D2
 
Ad

Asynchronous 101 - (1)

  • 1. 비동기 101 Basic of Asynchronous 첫 번째 이민철
  • 2. IT Revolution IC PC Internet Mobile
  • 3. 사용자의 증가 > 동시 접속자 증가 A. 연산을 더 빠르게 B. 동시성을 늘린다
  • 4. 사용자의 증가 > 동시 접속자 증가 A. 연산을 더 빠르게 1. 하드웨어 Upgrade 2. Low level Language B. 동시성을 늘린다 1. Parallelism 2. Concurrency
  • 5. 사용자의 증가 > 동시 접속자 증가 A. 연산을 더 빠르게 1. 하드웨어 Upgrade 2. Low level Language B. 동시성을 늘린다 1. Parallelism : 물리적인 level 에서 실제로 동시에 (병렬)처리 2. Concurrency : 논리적/software level에서 동시에 실행하는 것 처럼
  • 6. 사용자의 증가 > 동시 접속자 증가 A. 연산을 더 빠르게 1. 하드웨어 Upgrade ≒ more money 2. Low level Language B. 동시성을 늘린다 1. Parallelism ≒ more money 2. Concurrency
  • 8. Thread and Process Thread Process Process 보다 적은 overhead 와 자원 사용 Thread 보다 더 많은 자원(cpu, memory ..) 사용 멀티코어 활용이 어려움 (concurrency) 멀티코어를 활용할 수 있음 (Parallelism) Data 공유가 쉬움 Data 동기화가 어려움 공유 자원 접근의 위험성 (교착상태, 기아상태 …)
  • 9. 식사하는 철학자들 문제 다섯 명의 철학자가 원탁에 앉아 있고 • 철학자들은 생각하거나, 밥을 먹거나, 배가 고프거나 3가지 상 태를 가질 수 있다 • 각자의 앞에는 스파게티가 있고 양 옆에 포크가 하나씩 있다 • 각각의 철학자는 다른 철학자에게 말을 할 수 없다 • 철학자가 스파게티를 먹기 위해서는 양 옆의 포크를 동시에 들 어야 한다
  • 10. 식사하는 철학자들 문제 Solution 1 1. 왼쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능해 지면 집어 든다. 2. 오른쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능 해지면 집어 든다. 3. 양쪽의 포크를 잡으면 정해진 시간만큼 식사를 한다. 4. 오른쪽 포크를 내려놓는다. 5. 왼쪽 포크를 내려놓는다. 6. 다시 1번으로 돌아간다.
  • 11. 식사하는 철학자들 문제 Solution 1 동시에 왼쪽 포크를 모두 집어 들었다면? 계속 생각만 하는 상태에 빠지게 된다. => deadlock (교착상태) 발생!!
  • 12. 식사하는 철학자들 문제 Solution 2 1. 왼쪽 포크가 사용 가능해질 때까지 생각을 한다. 만약 사용 가능해 지면 집어 든다. 2. 오른쪽 포크를 들 수 있나 보고 안되면 왼쪽 포크를 내려놓고 1번 으로 되돌아간다. 3. 양쪽의 포크를 잡으면 정해진 시간만큼 식사를 한다. 4. 오른쪽 포크를 내려놓는다. 5. 왼쪽 포크를 내려놓는다. 6. 다시 1번으로 돌아간다.
  • 13. 식사하는 철학자들 문제 Solution 2 동시에 왼쪽 포크를 모두 집어 들었다면? 행위를 반복하다 보면 적게 먹는 사람이 생긴다. => Thread간의 불균등한 자원 공유! (기아상태)
  • 14. 식사하는 철학자들 문제 How to solve it? 자원 관리를 위한 software 적인 안전장치와 동시성 프로그래밍에 대한 skill 이 필요함 => 개발이 복잡하고 어려워 짐
  • 16. 식사하는 철학자들 문제 동시성 프로그래밍 (Concurrent Programming)
  • 17. Coroutine • 서브루틴 (sub routine) 반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것 우리에게 익숙한 이름! 함수, 메서드 • 코루틴 (coroutine) 루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시 원래 위치로 돌아와 나머지 루틴을 수행할 수 있다 ???
  • 19. Coroutine • 서브루틴 (sub routine) 반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것 우리에게 익숙한 이름! 함수, 메서드 • 코루틴 (coroutine) 루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시 원래 위치로 돌아와 나머지 루틴을 수행할 수 있다  비동기와 결합하면 더욱 강력해진다!
  • 20. 동기(Synchronous)와 비동기(Asynchronous) • 동기: 시간 관계를 동시에 또는 동일하게 유지하는 처리 방식 (sync를 맞추다, 동기화 하다) Ex: 대부분의 FPS 게임 – 유저 데이터의 시간 관계를 맞춰야 함 비디오와 자막의 싱크 • 비동기: sync를 맞추지 않아도 되는 처리 방식 (순차적이어도 되고 비순차적이어도 된다) Ex: 듀랑고 – 비동기식으로 유저 데이터 수용 https://www.slideshare.net/sublee/spof-mmorpg
  • 21. 동기(Synchronous)와 비동기(Asynchronous) • 어떠한 관점으로 보는가에 따라 다르게 해석할 수 있다 • 다양한 곳에서 동기와 비동기를 활용한다 [Serial 통신에서의 활용] [CPU 연산에서의 활용 (pipelining)]
  • 22. 동기식 프로그래밍, 비동기식 프로그래밍 • 프로그램 관점에서 본 동기, 비동기 • 서브루틴의 수행 시간을 기준으로 동기: 모든 루틴을 순차적으로 진행 비동기: 몇몇 루틴을 비순차적으로 진행할 수도 있음
  • 24. 동기식과 비동기식으로 빨래 돌리기 1. 세탁기 돌리기 (40분 소요) 2. 건조기 돌리기 (20분 소요) 3. 빨래 개기 (10분 소요)
  • 25. 동기식 execute washer execute dryer fold laundry 70 min
  • 26. 동기식: 3번의 빨래를 한다면? execute washer execute dryer fold laundry execute washer execute dryer fold laundry 210 min execute washer execute dryer fold laundry
  • 27. 비동기식: 3번의 빨래를 한다면 150 min execute washer execute dryer fold laundry execute washer execute dryer fold laundry execute washer execute dryer fold laundry
  • 28. 비동기식: 3번의 빨래를 한다면 execute washer execute dryer fold laundryexecute washer execute dryer fold laundryexecute washer execute dryer fold laundry 150 min 건조기를 작동시키고 나서 바로 세탁기를 돌릴 수 있다
  • 31. So, How to make asynchronous program? 좋은 건 알겠는데.. 프로세스를 비동기식으로 만들기 위해서는?
  • 32. Non-block 의 등장 Block <-> Non-block 명확한 논리적 기준으로 구분 가능한 반대 개념 Block: • 함수가 끝날 때 까지 기다린다. • 함수의 결과를 return 한다. Non block: • 함수를 바로 return 한다. • 함수의 결과를 따로 저장한다.
  • 33. Non-block 의 등장 function Main wait Main Non block Object function return is_finish False is_finish result True 빈 시간 동안 다른 작업을 할 수 있다 Run concurrency Block Non block
  • 34. Non-block 의 등장 논블록 함수의 결과를 얻으려면 언제 끝나는지 물어봐야 한다 언제 끝나는지 계속 물어보는 과정이 필요함 Event Loop!
  • 35. Event Loop • 외부 환경에서 이벤트를 받는다. • 이벤트가 발생하면 해당 이벤트에 대한 루틴을 실행시킨다.
  • 36. Non block + Event Loop => Async ! Non block 함수가 완료되었는지 아닌지를 검사하는 event loop • 원시적인 asynchronous loop는 작업이 완료되었는지 아닌지를 event loop가 주기적으로 물어본다 • 더 효율적인 asynchronous loop는 어떤 작업의 상태가 바뀌었 는지를 select 한다 • 완전 효율적인 asynchronous loop는 작업의 상태가 바뀌면 event loop에게 알려준다 (커널의 도움이 필요함) 여러가지 I/O Multiplexing 기술들
  • 37. Async • 그럼 비동기 loop에 non block이 아닌 block 함수가 들어오면? Block 함수가 실행되는 동안 event loop가 멈춘다! 성능의 저하 발생 • 가장 좋은 방법은 비동기 loop에서 non block 함수만 실행하는 것. 그러나 피치 못할 사정으로 block 함수를 실행해야 할 때가 있다. Block 함수를 Thread나 Process로 concurrency 하게 실행해서 non block 처럼 만든다.
  • 39. 다시 shared data 접근의 위험 발생 • 여러 스레드가 같은 데이터를 참조 할 때 Thread1 Thread2 Thread3 프로세스의 흐름 data
  • 40. 도와줘요 코루틴 • 코루틴은 중간에 루틴을 중단했다 다시 시작할 수 있다. • 코루틴을 어떻게 비동기로 동작 시킬 수 있을까
  • 41. 여러 개의 http 요청 보내기 • 한 개의 http 요청을 보내는 과정 1. http 프로토콜 형식에 맞게 문자열을 만든다. 2. 해당 문자열을 서버로 보낸다. 3. 서버한테 답장이 올 때 까지 기다린다. 4. 답장이 오면 결과를 저장한다.
  • 42. 여러 개의 http 요청 보내기 • 한 개의 http 요청을 보내는 과정 1. http 프로토콜 형식에 맞게 문자열을 만든다. 2. 해당 문자열을 서버로 보낸다. 3. 서버한테 답장이 올 때 까지 기다린다. 4. 답장이 오면 결과를 저장한다. 매우 적은 시간 많은 시간 소요 매우 적은 시간
  • 43. 여러 개의 http 요청 보내기 • 한 개의 http 요청을 보내는 과정 1. http 프로토콜 형식에 맞게 문자열을 만든다. 2. 해당 문자열을 서버로 보낸다. 3. 서버한테 답장이 올 때 까지 기다린다. 4. 답장이 오면 결과를 저장한다. 매우 적은 시간 많은 시간 소요 시간 중단 재개 Coroutine 매우 적은 시간 1 2 3 4
  • 44. 여러 개의 http 요청 보내기 시간 Coroutine Single thread with Async Loop Coroutine Coroutine Coroutine
  • 45. Single thread with Async Loop 여러 개의 http 요청 보내기 시간
  • 46. Coroutine + Async • 동시성을(concurrent) 구현 But! Single thread Single thread에서 실행되기 때문에 shared data 접근의 충돌의 걱정 이 아얘 사라짐! 동시성에 대한 안전장치를 만들지 않아도 되기때문에 코드 작성이 쉬움 개발 효율 증가 • 동시성이 있지만 또 다른 thread나 process를 만들 필요가 없음 메모리를 아낄 수 있음 Thread나 Process를 만드는 것에 대한 overhead가 없음. 시간 단축
  • 47. Coroutine + Async [동기식 서버와 비동기식 서버의 메모리 사용량]
  • 48. Coroutine + Async 그러나 코루틴은 만병통치약이 아님 • 블록킹 함수 또는 CPU bound 작업을 할때 성능이 저하 됨 한 작업을 할 때에는 다른 작업을 처리할 수 없다. 블록킹 함수는 thread로 처리하자. 그 블록킹 함수가 shared data를 참조해야 하는 경우에는 결국 동시성 프로그래밍에 대한 지식과 software적 안전장치를 마련 해야함.
  • 49. CPU bound? IO bound? Bound: 밀접한 관계에 있는 • CPU bound: 연산이나 처리량이 많은 경우 ex) 문자열 연산, 사칙연산, 영상/이미지 처리 • IO bound: 입력과 출력이 많은 경우 • 보통 IO작업은 대기시간이 길고 CPU를 거의 사용하지 않는다 ex) file I/O, network I/O
  • 50. 언제 비동기를 써야 할까 • 처리 순서의 시간 관계가 관련이 없는 작업이 많을 때 • IO bound 작업이 많을 때 • 여러 개의 작업을 처리 해야 할 때
  • 51. CPU bound 작업의 동시성은 어떻게 늘리나요?
  • 52. CPU bound 작업의 동시성은 어떻게 늘리나요? A. 연산을 더 빠르게 1. 하드웨어 Upgrade 2. Low level Language B. 동시성을 늘린다 1. Parallelism 2. Concurrency 나머지 방안을 생각 하자
  • 53. 동기식 프로그래밍 with Python [100개의 요청, 31 초 소요]
  • 54. 비동기식 프로그래밍 with Python [100개의 요청, 0.4 초 소요]
  • 55. 다음 시간에는… • 비동기식 처리를 어떻게 Programming Language 에서 표현할 수 있는가 • Python + 비동기