๐ ๋ธ๋กํน/๋ ผ๋ธ๋กํน ๋ฐ ๋๊ธฐ/๋น๋๊ธฐ
Blocking / Non-blocking ์ฐจ์ด
Blocking
- ํจ์ ํธ์ถ -> ๊ฒฐ๊ณผ ๋์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆผ (๋ค์ ์ฝ๋ ์คํ ๋ถ๊ฐ ์ํ)
- ํธ์ถํ ์ค๋ ๋๊ฐ ๋ฉ์ถฐ์์
- ํจ์๋ฅผ ํธ์ถํ ์ค๋ ๋๊ฐ ์์ ์ด ๋๋ ๋๊น์ง ์ ์ด๊ถ์ ๋๋ ค๋ฐ์ง ๋ชปํ๋ ์ํ
Non-blocking
- ํจ์ ํธ์ถ โ ๋ฐ๋ก ๋ฆฌํด
- ํธ์ถํ ์ชฝ์ ๊ณ์ ์คํ๋จ
- ๊ฒฐ๊ณผ๋ ๋์ค์ ํ์ธ
- ์์
์ด ๋๋์ง ์์๋๋ผ๋ ์ฆ์ ์ ์ด๊ถ์ ํธ์ถ์์๊ฒ ๋ฐํํ๋ ๋ฐฉ์
- ๊ธฐ๋ค๋ฆฌ์ง ์๋ ๊ฒ ์๋๋ผ ๋ฉ์ถ์ง ์๋ ๊ฒ
- ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆด์๋ ์์ง๋ง ๋ค๋ฅธ ์ผ์ ํ๋ฉด์ ๊ธฐ๋ค๋ฆผ
์ ๋ฆฌ
- Blocking๊ณผ Non-blocking์ ์ฐจ์ด๋ ๋จ์ํ โ๊ธฐ๋ค๋ฆฐ๋ค/๊ธฐ๋ค๋ฆฌ์ง ์๋๋คโ์ ๋ฌธ์ ๊ฐ ์๋๋ค. ํต์ฌ์ ํจ์ ํธ์ถ ์ ์ ์ด๊ถ์ด ํธ์ถ์์๊ฒ ์ฆ์ ๋ฐํ๋๋์ง ์ฌ๋ถ์ด๋ค. Blocking ํธ์ถ์ ์์ ์ด ๋๋ ๋๊น์ง ํธ์ถํ ์ค๋ ๋๋ฅผ ๋ฉ์ถ๊ฒ ํ์ง๋ง, Non-blocking ํธ์ถ์ ์์ ์งํ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ฆ์ ๋ฐํ๋์ด ํธ์ถ์๊ฐ ๋ค๋ฅธ ์์ ์ ๊ณ์ ์ํํ ์ ์๋๋ก ํ๋ค.
๋๊ธฐ(Sync) / ๋น๋๊ธฐ(Async) ์ฐจ์ด

๋๊ธฐ(Sync)
- ์์ฐจ์ ์ฒ๋ฆฌ ๋ฐฉ์
- ์์ฒญ์ ๋ณด๋ธ ํ ์๋ต์ด ์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค ๋ค์ ์์ ์ํํ๋ ๊ฒ (์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์์ฒญ์ ๋๊ธฐํจ)
- ํธ์ถํ ์ชฝ์ด ์ง์ ์๋ฃ ์ฌ๋ถ๋ฅผ ์ฑ ์์ง๊ณ ํ์ธ
-
while(isDone()) ๊ฐ์ ๋๋
- ์์์ฝ๋
import requests from django.http import JsonResponse def sync_view(request): // ํด๋ผ์ด์ธํธ ์์ฒญ ๋ค์ด์ค๋ฉด ์คํ response = requests.get("https://api.example.com/data") data = response.json() // ์๋ต ๋ฐ์ผ๋ฉด ๋ฐ์ดํฐ ํ์ฑ return JsonResponse(data)- requests.get()์ ํธ์ถ ํ์ฌ ์ธ๋ถ API์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ด ์ฌ๋๊น์ง ์ค๋ ๋๋ ๋ฉ์ถฐ์๋ ์ํ์ -> ๋๊ธฐ ๋ฐฉ์
- Blocking + Sync ์กฐํฉ์ ์ฝ๋ ์์
- requests.get()์ Blocking ๊ด์ ์์ ๋ณด๋ฉด Blocking I/O์
๋น๋๊ธฐ(Async)
- I/O ์์
์ค ๋ค๋ฅธ ์์
์ ๋์์ ์ํ ๊ฐ๋ฅํจ
- ๋์ ๋์ ์ฒ๋ฆฌ๋๊ณผ ๋น ๋ฅธ ์๋ต์ ํน์ง
- ์์ ์ด ๋๋๋ฉด ์๋๊ฐ ์๋ ค์ค
-
callback / signal / event / interrupt
- ์์์ฝ๋
import httpx from django.http import JsonResponse async def async_view(request): // ์์ฒญ ๋ค์ด์ค๋ฉด ์คํ async with httpx.AsyncClient() as client: response = await client.get("https://api.example.com/data") data = response.json() return JsonResponse(data)- client.get()์ผ๋ก ์ธ๋ถ API ์์ฒญ์ ์์ํ์ง๋ง
- await ๋ง๋๋ฉด์ ํ์ฌ ์์ ์ ์ด๋ฒคํธ ๋ฃจํ์ ์ ์ด๊ถ์ ๋๊ธฐ๊ณ , ์ค๋ ๋๋ ๋ฉ์ถ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์ํ
- Non-blocking + Async ์กฐํฉ์ ๋ํ์ ์ธ ์์
- await client.get()์ Non-blocking ๊ด์ ์์ ๋ณด๋ฉด Non-blocking์
์กฐํฉ
Blocking + Sync : ํธ์ถ โ ๋ฉ์ถค โ ์ง์ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ
Non-blocking + Sync : ๊ณ์ ๋ฌผ์ด๋ณด๋ฉด์ ํ์ธ (busy waiting)
Non-blocking + Async : ๋งก๊ฒจ๋๊ณ ๋ด ์ผ โ ๋๋๋ฉด ํต๋ณด๋ฐ์
Blocking + Async : ์ด๋ก ์ ๊ฐ๋ฅํ์ง๋ง ๊ฑฐ์ ์ ์
๋ง๋ฌด๋ฆฌ
- ๋ง์ ๊ฒฝ์ฐ Blocking๊ณผ ๋๊ธฐ๊ฐ ํจ๊ป ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ์คํดํ์๋ค.
- ๊ธฐ๋ค๋ฆฌ๋ฉด = ๋๊ธฐ, Blocking / ์๊ธฐ๋ค๋ฆฌ๋ฉด = ๋น๋๊ธฐ, Non-blocking ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ๊ฐ๋ ์ ์ผ๋ก ์์ ํ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์์๋ค.
- Blocking โ ๋๊ธฐ
- Blocking์ ํธ์ถํ ์ค๋ ๋๊ฐ ๋ฉ์ถ๋์ง์ ๋ํ ๊ฐ๋
- ๋๊ธฐ๋ ์์ ์๋ฃ๋ฅผ ๋๊ฐ ํ์ธํ๋์ง์ ๋ํ ๊ฐ๋