SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
비동기 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 이 필요함
=> 개발이 복잡하고 어려워 짐
식사하는 철학자들 문제
동시성 프로그래밍 (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
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 + 비동기

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Vim Rocks!
Vim Rocks!Vim Rocks!
Vim Rocks!
 
Android for Embedded Linux Developers
Android for Embedded Linux DevelopersAndroid for Embedded Linux Developers
Android for Embedded Linux Developers
 
Null safety in dart and flutter , the whole story!
Null safety in dart and flutter , the whole story!Null safety in dart and flutter , the whole story!
Null safety in dart and flutter , the whole story!
 
HSA Queuing Hot Chips 2013
HSA Queuing Hot Chips 2013 HSA Queuing Hot Chips 2013
HSA Queuing Hot Chips 2013
 
Complete Guide for Linux shell programming
Complete Guide for Linux shell programmingComplete Guide for Linux shell programming
Complete Guide for Linux shell programming
 
Intro to kotlin
Intro to kotlinIntro to kotlin
Intro to kotlin
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Qt5 on ti processors
Qt5 on ti processorsQt5 on ti processors
Qt5 on ti processors
 
linux interview questions and answers
linux interview questions and answerslinux interview questions and answers
linux interview questions and answers
 
Working Remotely (via SSH) Rocks!
Working Remotely (via SSH) Rocks!Working Remotely (via SSH) Rocks!
Working Remotely (via SSH) Rocks!
 
Embedded Android : System Development - Part IV
Embedded Android : System Development - Part IVEmbedded Android : System Development - Part IV
Embedded Android : System Development - Part IV
 
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry PiRunning Android on the Raspberry Pi: Android Pie meets Raspberry Pi
Running Android on the Raspberry Pi: Android Pie meets Raspberry Pi
 
C# Async Await
C# Async AwaitC# Async Await
C# Async Await
 
Task parallel library presentation
Task parallel library presentationTask parallel library presentation
Task parallel library presentation
 
강좌 개요
강좌 개요강좌 개요
강좌 개요
 
Inside Android's UI
Inside Android's UIInside Android's UI
Inside Android's UI
 
WebdriverIO: the Swiss Army Knife of testing
WebdriverIO: the Swiss Army Knife of testingWebdriverIO: the Swiss Army Knife of testing
WebdriverIO: the Swiss Army Knife of testing
 
Exploiting the Linux Kernel via Intel's SYSRET Implementation
Exploiting the Linux Kernel via Intel's SYSRET ImplementationExploiting the Linux Kernel via Intel's SYSRET Implementation
Exploiting the Linux Kernel via Intel's SYSRET Implementation
 
Automotive android
Automotive androidAutomotive android
Automotive android
 
Q2.12: Debugging with GDB
Q2.12: Debugging with GDBQ2.12: Debugging with GDB
Q2.12: Debugging with GDB
 

Semelhante a Asynchronous 101 - (1)

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu Kang
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
Youngmin Koo
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
NAVER D2
 

Semelhante a Asynchronous 101 - (1) (20)

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)More Effective Python 3st (Multitask)
More Effective Python 3st (Multitask)
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
Concurreny programming
Concurreny programmingConcurreny programming
Concurreny programming
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
오픈스택! 이틀이면할수있다! 시즌2
오픈스택! 이틀이면할수있다! 시즌2오픈스택! 이틀이면할수있다! 시즌2
오픈스택! 이틀이면할수있다! 시즌2
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
 
PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기PHP로 Slack Bot 만들기
PHP로 Slack Bot 만들기
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
 
배포
배포배포
배포
 
Reduce testing time by Multiprocessing in python
Reduce testing time by Multiprocessing in pythonReduce testing time by Multiprocessing in python
Reduce testing time by Multiprocessing in python
 
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅
 
Microsoft pp lpdf
Microsoft pp lpdfMicrosoft pp lpdf
Microsoft pp lpdf
 
동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
백억개의 로그를 모아 검색하고 분석하고 학습도 시켜보자 : 로기스
 

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 이 필요함 => 개발이 복잡하고 어려워 짐
  • 15.
  • 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 건조기를 작동시키고 나서 바로 세탁기를 돌릴 수 있다
  • 30.
  • 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 + 비동기