A4 thread blockingisevil
-
Upload
naver-d2 -
Category
Technology
-
view
1.781 -
download
0
Transcript of A4 thread blockingisevil
![Page 1: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/1.jpg)
Thread Blocking Is Evil
게임네트웍컴포넌트팀
김준현
![Page 2: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/2.jpg)
Thread
Blocking
![Page 3: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/3.jpg)
Non-Blocking
&
순차적 코드 작성
![Page 4: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/4.jpg)
Why does
Multi-Thread
matter?
![Page 5: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/5.jpg)
“The Free Lunch
is OVER.”
Herb Sutter
December 2004
![Page 6: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/6.jpg)
Clock speed
Execution optimization
Cache
![Page 7: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/7.jpg)
Cache
Hyperthreading
Multicore
Cache
![Page 8: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/8.jpg)
Write Multithreaded
Application
![Page 9: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/9.jpg)
MULTI
THREAD
![Page 10: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/10.jpg)
CONCURRENCY
![Page 11: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/11.jpg)
하지만 현실은?
![Page 12: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/12.jpg)
줄을 서서 기다린다
![Page 13: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/13.jpg)
도대체
왜?
![Page 14: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/14.jpg)
Thread
Blocking
![Page 15: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/15.jpg)
Starvation
Deadlock
![Page 16: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/16.jpg)
Starvation
![Page 17: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/17.jpg)
Task A Task B
1: Lock 1: Sleep 1msec
2: Sleep 2msec
3: Unlock
![Page 18: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/18.jpg)
![Page 19: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/19.jpg)
Deadlock Hold & Wait
![Page 20: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/20.jpg)
Thread A Thread B
1A: Lock 1B: Lock
2A: Request 2B: Send Response
3A: Wait for Response 3B: Unlock
4A: Do something with Response
5A: Unlock
![Page 21: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/21.jpg)
Thread A Thread B
1A: Lock 1B: Lock
2A: Request 2B: Send Response
3A: Wait for Response 3B: Unlock
4A: Do something with Response
5A: Unlock
![Page 22: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/22.jpg)
My
Problem
![Page 23: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/23.jpg)
로비-룸 형태의
게임을 제작
![Page 24: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/24.jpg)
Remote Procedure Call
![Page 25: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/25.jpg)
처리 로직을 함수 단위로
짜기 때문에 개발이 쉽다
![Page 26: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/26.jpg)
Game Client Lobby Room 방 입장 RPC 인증 RPC
![Page 27: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/27.jpg)
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
인증 RPC 반환
방 입장 RPC 반환
방 입장 RPC
처리 로직
인증 RPC
처리 로직
![Page 28: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/28.jpg)
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
방 입장 RPC
처리 로직
인증 RPC
처리 로직
인증 RPC 반환
방 입장 RPC 반환
![Page 29: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/29.jpg)
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
인증 RPC 반환
방 입장 RPC 반환
방 입장 RPC
처리 로직
인증 RPC
처리 로직 Lobby 응답 지연
![Page 30: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/30.jpg)
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
인증 RPC 반환
방 입장 RPC 반환
방 입장 RPC
처리 로직
인증 RPC
처리 로직 Lobby 응답 지연
Room서버 throughput
저하
![Page 31: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/31.jpg)
악의 축은?
![Page 32: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/32.jpg)
Thread
Blocking
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
인증 RPC 반환
방 입장 RPC 반환
![Page 33: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/33.jpg)
RPC의 태생적 한계
![Page 34: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/34.jpg)
처리 로직을 함수 단위로
짜기 때문에 개발이 쉽다
![Page 35: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/35.jpg)
처리 로직을 함수 단위로
짜기 때문에 찢을 수 없다
![Page 36: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/36.jpg)
RPC::Result* JoinRoom(…)
{
…
RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);
….
return result;
}
![Page 37: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/37.jpg)
우리가 원하는 것
![Page 38: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/38.jpg)
RPC의 장점인
순차적 코드 작성
Non-Blocking
![Page 39: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/39.jpg)
가능한 해결책은?
![Page 40: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/40.jpg)
RPC 이원화
![Page 41: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/41.jpg)
Game Client Lobby Room
방 입장 응답 RPC
인증 요청 RPC 방 입장 요청 RPC
인증 응답 RPC
![Page 42: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/42.jpg)
Game Client Lobby Room
방 입장 응답 RPC
인증 요청 RPC 방 입장 요청 RPC
인증 응답 RPC
Non-Blocking O
순차적 코딩 X
![Page 43: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/43.jpg)
RPC 이원화
![Page 44: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/44.jpg)
Thread Pool 분리
![Page 45: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/45.jpg)
Game Client Lobby TP#1
방 입장 RPC 인증 RPC Room
TP#2
기타 RPCs
![Page 46: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/46.jpg)
Game Client Lobby TP#1
방 입장 RPC 인증 RPC Room
TP#2
기타 RPCs
순차적 코딩 O
Non-Blocking X
![Page 47: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/47.jpg)
Thread Pool 분리
![Page 48: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/48.jpg)
이대로 끝인 거야?
![Page 49: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/49.jpg)
Solution
![Page 50: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/50.jpg)
Asynchronous
Programming
![Page 51: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/51.jpg)
Request(callback, …)
![Page 52: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/52.jpg)
Pros: Non-Blocking
![Page 53: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/53.jpg)
Cons: Can’t Write Sequential Code
Can’t Use Stack Variable
Can’t Split Programming Construct
…
![Page 54: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/54.jpg)
어렵다!
![Page 55: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/55.jpg)
이대로 끝인 거야?
![Page 56: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/56.jpg)
Coroutine
![Page 57: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/57.jpg)
Similar to Thread
![Page 58: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/58.jpg)
Line of Execution
![Page 59: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/59.jpg)
Stack
&
Local Variable
![Page 60: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/60.jpg)
But
![Page 61: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/61.jpg)
Non-preemptive
![Page 62: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/62.jpg)
Instruction: Yield
Yield Break
Resume
![Page 63: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/63.jpg)
Coroutine을
제공하는 언어는?
![Page 64: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/64.jpg)
C#
Erlang
Haskell
JavaScript(since 1.7)
Lua
Perl
Python(since 2.5)
Ruby
…
![Page 65: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/65.jpg)
C++은?
![Page 66: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/66.jpg)
![Page 67: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/67.jpg)
손수 구현해야 한다
![Page 68: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/68.jpg)
Windows: Fiber
Linux:
getcontext/setcontext
makecontext
swapcontext
![Page 69: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/69.jpg)
Asynchronous
Programming
+
Coroutine
![Page 70: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/70.jpg)
Non-Blocking
&
순차적 코드 작성
![Page 71: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/71.jpg)
Solution
for
Starvation
![Page 72: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/72.jpg)
Task A Task B
1: Lock 1: Sleep 1msec
2: Sleep 2msec
3: Unlock
![Page 73: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/73.jpg)
Task A Task B
Thread A 1: Sleep 1msec
1: Create & Resume Coroutine
2: Request Lock
3: Yield
Thread A‟
4: Resume
5: Sleep 2msec
6: Yield Break
7: Unlock
Non-Blocking
Sequential
Code
![Page 74: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/74.jpg)
![Page 75: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/75.jpg)
![Page 76: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/76.jpg)
Solution for
Deadlock Hold & Wait
![Page 77: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/77.jpg)
Thread A Thread B
1A: Lock 1B: Lock
2A: Request 2B: Send Response
3A: Wait for Response 3B: Unlock
4A: Do something with Response
5A: Unlock
![Page 78: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/78.jpg)
Thread A Thread B
1A: Lock 1B: Lock
2A: Create & Resume Coroutine 2B: Send Response
3A: Request 3B: Unlock
4A: Yield
5A: Unlock
Thread A‟ (invoked by response)
6A’: Lock
7A’: Resume
8A’: Do something
with response
9A’: Yield Break
10A’: Unlock
Non-Blocking
Sequential
Code
![Page 79: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/79.jpg)
Solution
for
My Problem
![Page 80: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/80.jpg)
Thread
Blocking
Game Client Lobby Room
방 입장 RPC 호출
인증 RPC 호출
인증 RPC 반환
방 입장 RPC 반환
![Page 81: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/81.jpg)
룸 Thread 로비 서비스
1R: 인증 요청 1L: 인증 요청 처리
2R: 인증 응답 대기 2L: 인증 응답 보내기
3R: 방 입장 처리
![Page 82: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/82.jpg)
룸 Thread 로비 서비스
1R: Create & Resume Coroutine 1L: 인증 요청 처리
2R: 인증 요청 2L: 인증 응답 보내기
3R: Yield
룸 Thread‟ (invoked by response)
4R’: Resume
5R’: 방 입장 처리
6R’: Yield Break
Non-Blocking
Sequential
Code
![Page 83: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/83.jpg)
Request & Wait
Request & Yield
![Page 84: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/84.jpg)
Non-Blocking
RPC의 장점인
순차적 코드 작성
![Page 85: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/85.jpg)
Coroutine
(Fiber)
Thread
CPU CPU CPU CPU
User-mode Scheduling
Kernel-mode Scheduling
![Page 86: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/86.jpg)
Coroutine
Pool
Network I/O
Thread Pool
RPC Task Queue
RPC
Execution
Thread Pool
![Page 87: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/87.jpg)
RPC Task
Queue RPC Execution
Thread Network I/O
Thread
enqueue
task
dequeue
task
acquire coroutine
enqueue
resume
task
dequeue
resume
task
resume
yield break
release coroutine
Network
Event
Network
Event
Coroutine
Pool
pooling
coroutine
RPC
Execution
yield return
start
![Page 88: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/88.jpg)
RPC Task
Queue RPC Execution
Thread 1 Coroutine
Pool
RPC
Execution
enqueue
task
dequeue
task
acquire coroutine
coroutine
yield return
enqueue
resume
task
dequeue
resume
task
release coroutine
Network
Event
Network
Event
pooling
RPC Execution
Thread 2
resume
yield break
resume
Network I/O
Thread
![Page 89: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/89.jpg)
RPC::Result* JoinRoom(…)
{
…
RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);
….
return result;
}
![Page 90: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/90.jpg)
RPC::Result* JoinRoom(…)
{
…
RPC::Result answer = RPC::SyncCallYield(“VerifyLobbyUserToken”, …);
….
return result;
}
![Page 91: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/91.jpg)
TPS
쓰래드 갯수
![Page 92: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/92.jpg)
Wrap-up
![Page 93: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/93.jpg)
“The free lunch
is OVER.”
Write Multithreaded
Application
CONCURRENCY
![Page 94: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/94.jpg)
Thread Blocking is Evil
Starvation Deadlock
![Page 95: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/95.jpg)
Asynchronous
Programming
+
Coroutine
![Page 96: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/96.jpg)
Non-Blocking
+
Writing
Sequential Code
![Page 97: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/97.jpg)
Request & Wait
Request & Yield
![Page 98: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/98.jpg)
Inspired by Jeffrey Richter
‘Simplified APM With
The AsyncEnumerator’
![Page 99: A4 thread blockingisevil](https://reader034.fdocuments.net/reader034/viewer/2022042816/5588f805d8b42a974e8b467a/html5/thumbnails/99.jpg)
완벽함이란
더 이상 추가할 것이 없을
때가 아니라
더 이상 버릴 것이 없을
때 완성된다. „성당과 시장‟에서