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 이 필요함
=> 개발이 복잡하고 어려워 짐
식사하는 철학자들 문제
동시성 프로그래밍 (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 + 비동기

More Related Content

What's hot

TransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by TransformerTransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by Transformer
Yasutomo Kawanishi
 
Deep Learningによる超解像の進歩
Deep Learningによる超解像の進歩Deep Learningによる超解像の進歩
Deep Learningによる超解像の進歩
Hiroto Honda
 
落合陽一前陣速攻のスライド0131 #JILS
落合陽一前陣速攻のスライド0131 #JILS 落合陽一前陣速攻のスライド0131 #JILS
落合陽一前陣速攻のスライド0131 #JILS
Yoichi Ochiai
 
Can increasing input dimensionality improve deep reinforcement learning?
Can increasing input dimensionality improve deep reinforcement learning?Can increasing input dimensionality improve deep reinforcement learning?
Can increasing input dimensionality improve deep reinforcement learning?
harmonylab
 
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
Deep Learning JP
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
Hiroyuki Yoshida
 
ブラックボックス最適化とその応用
ブラックボックス最適化とその応用ブラックボックス最適化とその応用
ブラックボックス最適化とその応用
gree_tech
 
Maxout networks
Maxout networksMaxout networks
Maxout networks
Junya Saito
 
Graph Neural Networks
Graph Neural NetworksGraph Neural Networks
Graph Neural Networks
tm1966
 
ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)
Youichiro Miyake
 
G2o
G2oG2o
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
Surveyから始まる研究者への道 - Stand on the shoulders of giants -Surveyから始まる研究者への道 - Stand on the shoulders of giants -
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
諒介 荒木
 
CVPR2016 reading - 特徴量学習とクロスモーダル転移について
CVPR2016 reading - 特徴量学習とクロスモーダル転移についてCVPR2016 reading - 特徴量学習とクロスモーダル転移について
CVPR2016 reading - 特徴量学習とクロスモーダル転移について
Akisato Kimura
 
object detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: surveyobject detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: survey
Takuya Minagawa
 
【チュートリアル】コンピュータビジョンによる動画認識
【チュートリアル】コンピュータビジョンによる動画認識【チュートリアル】コンピュータビジョンによる動画認識
【チュートリアル】コンピュータビジョンによる動画認識
Hirokatsu Kataoka
 
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
Deep Learning JP
 
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
Deep Learning JP
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)
Youichiro Miyake
 
大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法Takuya Akiba
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
Yasuhiro Yoshimura
 

What's hot (20)

TransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by TransformerTransPose: Towards Explainable Human Pose Estimation by Transformer
TransPose: Towards Explainable Human Pose Estimation by Transformer
 
Deep Learningによる超解像の進歩
Deep Learningによる超解像の進歩Deep Learningによる超解像の進歩
Deep Learningによる超解像の進歩
 
落合陽一前陣速攻のスライド0131 #JILS
落合陽一前陣速攻のスライド0131 #JILS 落合陽一前陣速攻のスライド0131 #JILS
落合陽一前陣速攻のスライド0131 #JILS
 
Can increasing input dimensionality improve deep reinforcement learning?
Can increasing input dimensionality improve deep reinforcement learning?Can increasing input dimensionality improve deep reinforcement learning?
Can increasing input dimensionality improve deep reinforcement learning?
 
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
 
ブラックボックス最適化とその応用
ブラックボックス最適化とその応用ブラックボックス最適化とその応用
ブラックボックス最適化とその応用
 
Maxout networks
Maxout networksMaxout networks
Maxout networks
 
Graph Neural Networks
Graph Neural NetworksGraph Neural Networks
Graph Neural Networks
 
ゲームAI入門(後半)
ゲームAI入門(後半)ゲームAI入門(後半)
ゲームAI入門(後半)
 
G2o
G2oG2o
G2o
 
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
Surveyから始まる研究者への道 - Stand on the shoulders of giants -Surveyから始まる研究者への道 - Stand on the shoulders of giants -
Surveyから始まる研究者への道 - Stand on the shoulders of giants -
 
CVPR2016 reading - 特徴量学習とクロスモーダル転移について
CVPR2016 reading - 特徴量学習とクロスモーダル転移についてCVPR2016 reading - 特徴量学習とクロスモーダル転移について
CVPR2016 reading - 特徴量学習とクロスモーダル転移について
 
object detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: surveyobject detection with lidar-camera fusion: survey
object detection with lidar-camera fusion: survey
 
【チュートリアル】コンピュータビジョンによる動画認識
【チュートリアル】コンピュータビジョンによる動画認識【チュートリアル】コンピュータビジョンによる動画認識
【チュートリアル】コンピュータビジョンによる動画認識
 
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
[DL輪読会]SurfelGAN: Synthesizing Realistic Sensor Data for Autonomous Driving
 
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
[DL輪読会]Grokking: Generalization Beyond Overfitting on Small Algorithmic Datasets
 
ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)ゲームAI製作のためのワークショップ(III)
ゲームAI製作のためのワークショップ(III)
 
大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法大規模グラフ解析のための乱択スケッチ技法
大規模グラフ解析のための乱択スケッチ技法
 
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう
 

Similar to Asynchronous 101 - (1)

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

Similar to 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 + 비동기