๐ ๋คํธ์ํฌ, ์์คํ ํ๋ก๊ทธ๋๋ฐ, ๋ฐฑ์๋ ๊ฐ๋ฐ ๋ฉด์ ์์ ์์ฃผ ๋์ค๋ ๊ธฐ๋ณธ ๊ฐ๋ !
1๏ธโฃ ๋ธ๋กํน(Blocking)์ด๋?
๋ธ๋กํน์ ํ๋์ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๋ค์ ์์
์ด ๋๊ธฐ(์ค๋จ) ์ํ์ ๋ค์ด๊ฐ๋ ๋ฐฉ์์
๋๋ค.
์ฃผ๋ก ์
์ถ๋ ฅ(I/O) ์์
์์ ๋ง์ด ์ฐ์ด๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ ์ฌ ๋๊น์ง ๊ฐ๋งํ ๊ธฐ๋ค๋ฆฌ๋ ๊ตฌ์กฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๐งช ์์ (Python)
data = socket.recv(1024) # ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ ๋๊น์ง ํ๋ก๊ทธ๋จ์ด ์ฌ๊ธฐ์ ๋ฉ์ถค
print("๋ฐ์ ๋ฐ์ดํฐ:", data)
์ ์ฝ๋์์ recv() ํจ์๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๊ฐ ์ค๊ธฐ ์ ๊น์ง ํ๋ก๊ทธ๋จ ์ ์ฒด๋ฅผ ๋ฉ์ถ๊ฒ(block) ํฉ๋๋ค.
โ ํน์ง
- ๊ตฌํ์ด ๋จ์ํ๊ณ ์ง๊ด์
- ์์ ์์๊ฐ ๋ช ํ
- ๋๊ธฐ ์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ
2๏ธโฃ ๋ ผ๋ธ๋กํน(Non-blocking)์ด๋?
๋
ผ๋ธ๋กํน์ ์์ฒญ์ ๋ณด๋ธ ํ, ์์
์ด ๋๋์ง ์์๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋ ๋ฐฉ์์
๋๋ค.
๊ฒฐ๊ณผ๋ ๋์ค์ ํ์ธํ๊ฑฐ๋ ์ฝ๋ฐฑ, ์ด๋ฒคํธ ๋ฑ์ ํตํด ๋ฐ์์ต๋๋ค.
๐งช ์์ (Python)
sock.setblocking(False)
try:
data = sock.recv(1024)
print("๋ฐ์ ๋ฐ์ดํฐ:", data)
except BlockingIOError:
print("์์ง ๋ฐ์ดํฐ ์์, ๋ค์ ์์
์งํ")
setblocking(False)๋ฅผ ์ฌ์ฉํ๋ฉด recv() ํธ์ถ ์ ๋ฐ์ดํฐ๊ฐ ์์ด๋ ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ์ง ์๊ณ ๋ค์ ์์ ์ ๊ณ์ ์ํํฉ๋๋ค.
โ ํน์ง
- ๋ค์ค ์์ ์ฒ๋ฆฌ์ ์ ๋ฆฌ (ํนํ ์น ์๋ฒ)
- ๋ ผ๋ฆฌ์ ํ๋ฆ์ด ๋ณต์กํ ์ ์์
- ์ฃผ๋ก select, poll, epoll, async/await ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉ
๐ ๋ธ๋กํน vs ๋ ผ๋ธ๋กํน ๋น๊ตํ
ํญ๋ชฉ ๋ธ๋กํน (Blocking) ๋ ผ๋ธ๋กํน (Non-blocking)
| ๋์ ๋ฐฉ์ | ์์ ์ด ๋๋ ๋๊น์ง ๋๊ธฐ | ๋ฐ๋ก ๋ฆฌํดํ๊ณ ๋ค๋ฅธ ์ผ ์ํ |
| ์๋ต ์ง์ฐ ์ | ์ ์ฒด ํ๋ฆ ์ค๋จ | ๋ค์ ์์ ๊ณ์ ๊ฐ๋ฅ |
| ์ฝ๋ ๋ณต์ก๋ | ๊ฐ๋จํ๊ณ ์ง๊ด์ | ์ด๋ฒคํธ ์ฒ๋ฆฌ, ์์ธ ์ฒ๋ฆฌ ๋ฑ ๋ณต์กํจ |
| ํ์ฉ ์ | CLI, ๋จ์ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ | ๊ณ ์ฑ๋ฅ ์น ์๋ฒ, ์ค์๊ฐ ์์คํ |
๐ ์ ๋ฆฌ
- ๋ธ๋กํน: ๋จ์ํ์ง๋ง, ๋ณ๋ ฌ์ฑ/์ฑ๋ฅ์ ๋ถ๋ฆฌ
- ๋ ผ๋ธ๋กํน: ์ฑ๋ฅ ์ข์ง๋ง, ๊ตฌ์กฐ๊ฐ ๋ณต์ก
๋น๋๊ธฐ(Async)์๋ ๋ค๋ฅธ ๊ฐ๋ ์ด์ง๋ง, ๋ ผ๋ธ๋กํน์ ์ข ์ข ๋น๋๊ธฐ I/O์ ๊ธฐ๋ฐ์ด ๋๊ธฐ๋ ํฉ๋๋ค.
๐ฏ ๋ฉด์ ์์ ์ด๋ ๊ฒ ๋ต๋ณํด๋ณด์ธ์!
“๋ธ๋กํน์ ์์ ์ด ๋๋ ๋๊น์ง ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ๋ ๋ฐฉ์์ด๊ณ , ๋ ผ๋ธ๋กํน์ ์์ฒญ๋ง ๋ณด๋ด๊ณ ๋ฐ๋ก ๋ค์ ์์ ์ ์ํํ๋ ๋ฐฉ์์ ๋๋ค. ๋ธ๋กํน์ ๊ตฌํ์ด ๊ฐ๋จํ์ง๋ง ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๊ณ , ๋ ผ๋ธ๋กํน์ ์ฑ๋ฅ์ ์ข์ง๋ง ๋ณต์กํ ํ๋ฆ ์ ์ด๊ฐ ํ์ํฉ๋๋ค.”