Blocking / Non-blocking ์ฐจ์ด

Blocking

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ๊ฒฐ๊ณผ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰ ๋ถˆ๊ฐ€ ์ƒํƒœ)
  • ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถฐ์žˆ์Œ
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ๋Œ๋ ค๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ

Non-blocking

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ ๋ฐ”๋กœ ๋ฆฌํ„ด
  • ํ˜ธ์ถœํ•œ ์ชฝ์€ ๊ณ„์† ์‹คํ–‰๋จ
  • ๊ฒฐ๊ณผ๋Š” ๋‚˜์ค‘์— ํ™•์ธ
  • ์ž‘์—…์ด ๋๋‚˜์ง€ ์•Š์•˜๋”๋ผ๋„ ์ฆ‰์‹œ ์ œ์–ด๊ถŒ์„ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹
    • ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๊ฒƒ
    • ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆด์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋ฉด์„œ ๊ธฐ๋‹ค๋ฆผ

์ •๋ฆฌ

  • Blocking๊ณผ Non-blocking์˜ ์ฐจ์ด๋Š” ๋‹จ์ˆœํžˆ โ€œ๊ธฐ๋‹ค๋ฆฐ๋‹ค/๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹คโ€์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ œ์–ด๊ถŒ์ด ํ˜ธ์ถœ์ž์—๊ฒŒ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ์—ฌ๋ถ€์ด๋‹ค. Blocking ํ˜ธ์ถœ์€ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ•˜์ง€๋งŒ, Non-blocking ํ˜ธ์ถœ์€ ์ž‘์—… ์ง„ํ–‰ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜์–ด ํ˜ธ์ถœ์ž๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๋™๊ธฐ(Sync) / ๋น„๋™๊ธฐ(Async) ์ฐจ์ด

image

๋™๊ธฐ(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์€ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…
    • ๋™๊ธฐ๋Š” ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๋ˆ„๊ฐ€ ํ™•์ธํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐœ๋…

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: