
์ค์ ๊ตํ: ๋น๋๊ธฐ/๋๊ธฐ๋ณด๋ค ์ค๋ ๋๊ฐ ์ ๋ฆฌํ ์ด์
์ค์ ๊ตํ: ๋น๋๊ธฐ/๋๊ธฐ๋ณด๋ค ์ค๋ ๋๊ฐ ์ ๋ฆฌํ ์ด์ ๊ด๋ จ
๋ณธ๋ฌธ์ ์์ฆIT์ ๋ฒ์ญ๊ฐ David (davidclimbing
)๊ฐ ํจ๊ป ์๋ฏผ ๋ก๋ํ(Armin Ronacher)์ ๊ธ <Playground Wisdom: Threads Beat Async/Await>์ ๋ฒ์ญํ ๊ธ์
๋๋ค. ์ค์คํธ๋ฆฌ์ ์ถ์ ์ ๊ฐ๋ฐ์๋ก, ํ์ด์ฌ ๊ธฐ๋ฐ์ ์น ํ๋ ์์ํฌ์ธ Flask์ ์ฐฝ์์๋ก ๋๋ฆฌ ์๋ ค์ ธ ์์ต๋๋ค. ํ์ฌ ์ผํธ๋ฆฌ(Sentry)์ ์์ง๋์ด๋ง ๋๋ ํฐ๋ก, ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ํ ๋น๋ฉ์ ์ฃผ๋ ฅํ๊ณ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋น๋๊ธฐ/๋๊ธฐ(Async/await)๋ ๋๋ถ๋ถ์ ์ธ์ด์์ ์๋ชป๋ ์ถ์ํ ๋ฐฉ์์ด๋ฏ๋ก, ์ค๋ ๋(Threads) ๊ธฐ๋ฐ์ ์ ๊ทผ๋ฒ์ด ๋ ๋์ ํด๊ฒฐ์ฑ
์ด ๋ ์ ์๋ค๊ณ ์ค๋ช
ํฉ๋๋ค.
๋น๋๊ธฐ/๋๊ธฐ(async/await) ๊ธฐ๋ฐ ์์คํ ์ ์ด๋ ค์๊ณผ ๋ฐฑํ๋ ์ [1]๋ฅผ ์ ๋๋ก ์ง์ํ์ง ๋ชปํ๋ ๋ฌธ์ ์ ๋ํด ๊ธ์ ์ด ์ง ๋ช ๋ ์ด ์ง๋ฌ์ต๋๋ค. ๋ช ๋ ์ด ์ง๋ ์ง๊ธ๋ ์ด ๋ฌธ์ ๊ฐ ํฌ๊ฒ ํด์๋์ง ์์์ง๋ง, ์ ์๊ฐ๊ณผ ์ดํด๋ ์กฐ๊ธ ๋ ๋ฐ์ ํ์ต๋๋ค. ์ด์ ์ ๋ ๋น๋๊ธฐ/๋๊ธฐ๋ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ข์ง ์์ ์ถ์ํ๋ผ๋ ํ์ ์ด ๋ค์๊ณ , ๋์ ์ค๋ ๋๋ผ๋ ๋ ๋์ ๋ฐฉํฅ์ ๋ชฉํ๋ก ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๊ธ์์๋ ์ด์ ์ ๋ง์ ํ๋ช ํ ๋ถ๋ค์ด ์ ์ํ๋ ์ฌ๋ฌ ์ฃผ์ฅ์ ๋ค์ ํ๋ฒ ๋์ง์ด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ค๋ฃจ๋ ๋ด์ฉ์ ์๋ก์ด ๊ฒ์ด ์๋๋ฉฐ, ๋จ์ง ์๋ก์ด ๋ ์๋ค์๊ฒ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฒ๋ฟ์ ๋๋ค. ํนํ ๋ค์์ ์ํฅ๋ ฅ ์๋ ๊ธ๋ค์ ์ฝ์ด๋ณด์๋ฉด ์ข์ต๋๋ค.
- ๋ฐฅ ๋์คํธ๋กฌ(Bob Nystrom)์ โWhat Color is Your Functionโ - ํ ๋ฐฉํฅ์ผ๋ก๋ง ํธํ๋๋ ๋ ๊ฐ์ง ์ ํ์ ํจ์๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค๋ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ ๋ด๊ณ ์์ต๋๋ค.
- ๋ก ํ๋ ์ฌ๋ฌ(Ron Pressler)์ โPlease stop polluting our imperative languages with pure conceptsโ - ์ด ์ฃผ์ ์ ๊ดํด ๊ฐ์ฅ ์ค์ํ ๊ฐ์ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
- ๋๋ค๋์ ์ค๋ฏธ์ค(Nathaniel J. Smith)์ โNotes on structured concurrency, or: Go statement considered harmfulโ - ๊ตฌ์กฐํ๋ ๋์์ฑ์ ๋๊ธฐ๋ฅผ ๋งค์ฐ ์ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
์์ฆ ์์ด๋ค์๊ฒ ์ต์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์
ํ๋ก๊ทธ๋๋จธ๋ก์ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ ์๋ ๋ฐฉ์์ ๋๋ฌด ์ต์ํด์ ธ์, ์์ ๋ก์ด ์ฌ๊ณ ๋ฅผ ๋ฐฉํดํ๋ ์๋ฌต์ ์ธ ๊ฐ์ ์ ํ๊ฒ ๋ฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ด๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
def move_mouse():
while mouse.x < 200:
mouse.x += 5
sleep(10)
def move_cat():
while cat.x < 200:
cat.x += 10
sleep(10)
move_mouse()
move_cat()
์ด ์ฝ๋๋ฅผ ์ฝ๊ณ ๋ค์ ์ง๋ฌธ์ ๋ตํด๋ณด์ธ์. ์ฅ์ ๊ณ ์์ด๊ฐ ๋์์ ์์ง์ด๋์, ์๋๋ฉด ํ๋์ฉ ์ฐจ๋ก๋ก ์์ง์ด๋์? 10๋ช ์ ํ๋ก๊ทธ๋๋จธ ์ค 10๋ช ์ ํ๋ฆผ์์ด ํ๋์ฉ ์ฐจ๋ก๋ก ์์ง์ธ๋ค๊ณ ๋ตํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ด์ฌ๊ณผ ์ค๋ ๋, ์ค์ผ์ค๋ง ๋ฑ์ ๊ฐ๋ ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ ๊ฒ์ด์ฃ . ํ์ง๋ง ์คํฌ๋์น[2]์ ์ต์ํ ์์ด๋ค์๊ฒ ๋ฌผ์ด๋ณด๋ฉด, ์๋ง๋ ์ฅ์ ๊ณ ์์ด๊ฐ ๋์์ ์์ง์ธ๋ค๊ณ ๋๋ตํ ๊ฒ์ ๋๋ค.
์ด๋ ์คํฌ๋์น๋ฅผ ํตํด ํ๋ก๊ทธ๋๋ฐ์ ์ ํ ๊ฒฝ์ฐ, ์ผ์ข ์ ๊ธฐ์ด์ ์ธ ์กํฐ[3] ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ณ ์์ด์ ์ฅ๋ ๋ชจ๋ ๋ ๋ฆฝ์ ์ธ ์กํฐ์ ๋๋ค. ์ค์ ๋ก ์คํฌ๋์น UI์์๋ ์ด๊ฒ๋ค์ โ์คํ๋ผ์ดํธโ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด ์ ์ ๋งค์ฐ ๋ช ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค. ํ๋ฉด์ ์๋ ์คํ๋ผ์ดํธ์ ๋ก์ง์ ๋ถ์ฌํ๋ฉด, ์ด๋ฌํ ๋ชจ๋ ๋ก์ง์ด ๋์์ ์คํ๋ฉ๋๋ค. ๋๋์ง ์๋์? ์ฌ์ง์ด ์คํ๋ผ์ดํธ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์๋ ์์ต๋๋ค.
์ด๊ฑธ ์ ์ ์๊ฐํด ๋ณด๊ธธ ๋ฐ๋ ์ด์ ๋ ์ด๊ฒ์ด ๊ฝค ์๋ฏธ์ฌ์ฅํ๋ค๊ณ ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ์คํฌ๋์น๋ ๋งค์ฐ ๋จ์ํ ์์คํ ์ด๋ฉฐ, ์ด๋ฆฐ์์ด๋ค์๊ฒ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅด์น๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๋ฐ๋ฐ๋ ์ด ์์คํ ์ด ์ฑํํ ๋ชจ๋ธ์ด ๋ฐ๋ก ์กํฐ ์์คํ ์ ๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ํ์ด์ฌ, C# ๋๋ ๋ค๋ฅธ ์ธ์ด์ ์ ํต์ ์ธ ๊ต์ฌ๋ก ํ๋ก๊ทธ๋๋ฐ์ ์์ํ๋ค๋ฉด, ์๋ง๋ ์ค๋ ๋์ ๋ํด์๋ ๋งจ ๋ง์ง๋ง์ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ๋ฟ๋ง ์๋๋ผ, ์ค๋ ๋๋ฅผ ๋งค์ฐ ๋ณต์กํ๊ณ ๋๋ ค์ด ๊ฒ์ฒ๋ผ ์ค๋ช ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ ๋์ ๊ฒ์, ์กํฐ ํจํด์ ๋ํด์๋ ์๋ง๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ๋ค๋ฃจ๋ ๊ณ ๊ธ ์์ ์์๋ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ์ด๋ผ๋ ์ ์ ๋๋ค.
๋ฐ๋ฉด, ์คํฌ๋์น๋ ์ด๋ฌํ ์ ํต์ ์ธ ๋ฐฉ์๊ณผ ๋ค๋ฆ ๋๋ค. ์คํฌ๋์น์์๋ ์ค๋ ๋๋ ๋ชจ๋๋[4], ๋น๋๊ธฐ/๋๊ธฐ, ์ค์ผ์ค๋ฌ์ ๋ํด ์ ํ ์ธ๊ธํ์ง ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฐ๋ ์์ด๋ ์๋ํฉ๋๋ค. ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์ ๋ณผ ๋ ๋จ์ํ ๋ฉ์์ง ์ ๋ฌ์ ์ํ ๊ธฐ๋ณธ์ ์ธ โ๋ฌธ๋ฒโ๋ง ์๋ ๋ช ๋ นํ(๋น๋ก ํ๋ คํ๊ณ ์๊ฐ์ ์ด์ง๋ง) ์ธ์ด์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ํ ์ ์ ์คํฌ๋์น์์ ๋์์ฑ์ด ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฃจ์ด์ง๋๋ค. ์ด๋ฆฐ์์ด๋ค๋ ์ฝ๊ฒ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค. ๋์์ฑ์ ๋๋ ค์ํ ํ์๊ฐ ์๋ค๋ ๊ฑธ ๋ชธ์ ๋ณด์ฌ์ฃผ์ฃ .
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ์คํด
๋ ๋ฒ์งธ๋ก ๊ฐ์กฐํ๊ณ ์ถ์ ์ ์, ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋นํด ์ ํ ๋ถ์กฑํจ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋น๋ก ์ฐ๋ฆฌ ๋๋ถ๋ถ์ด ๋ฌธ์ ํด๊ฒฐ์ ์ํด ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง, ์ด๋ ์๊ฐ ์ด๊ฒ์ด ์ด๋ฑํ๊ณ ์์ํ์ง ์๋ค๋ ๊ด๋ ์ ๋ ธ์ถ๋์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๋ ์ธ๊ณ์๋ ๋ชจ๋๋(monad) ๊ฐ์ ๊ฐ๋ ๊ณผ ์กฐํฉ์ฑ, ๋ ผ๋ฆฌ, ์ํ ๋ฑ ๋ฉ์ง ์ ๋ฆฌ๋ค์ด ์๋ฆฌ ์ก๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ฉด, ๋ง์น ๋ ๋์ ์ฐจ์์ผ๋ก ์ฌ๋ผ๊ฐ์ if๋ฌธ๊ณผ for ๋ฃจํ๋ฅผ ์ด์ด ๋ถ์ด๊ณ , ์ด๊ณณ์ ๊ณณ์์ ๋ถ์์ฉ(side effects)์ ๋ง๋ค์ด๋ด๋ฉฐ, IO๋ฅผ ๋จ๋ฐํ๋ ์ฌ๋๋ค์ ๋ด๋ ค๋ค๋ณด๋ ๊ฒ ๊ฐ์ ๋๋์ ๋ฐ์ต๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ทธ์ผ๋ง๋ก ์์ํ๊ณ ๊ณ ์ํ ์ฝ๋ฉ์ ์ ์ ์ฒ๋ผ ๋ฌ์ฌ๋๊ณค ํ์ฃ .
๋ฌผ๋ก ์ ๊ฐ ์ข ๊ณผ์ฅํ์ ์๋ ์์ง๋ง, ์์ ํ ํ๋ฆฐ ์ด์ผ๊ธฐ๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์งํ ์ ๋ ์ดํดํฉ๋๋ค. ์ค์ ๋ก ๋ฌ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋๋ค[5]๋ฅผ ์ฐ๊ฒฐํ ๋ ๊ธฐ๋ถ์ด ์ง๋ฆฟํด์ง์ฃ . ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ตฌ์กฐ๋ค์ด ๋ง์ ์ธ์ด์์ ๋จ์ํ ๋ง๋ถ์ฌ์ง ๊ธฐ๋ฅ์ด๋ผ๋ ์ ์ ์ธ์ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Go๋ ๋๋ถ๋ถ์ ํจ์ํ ๊ธฐ๋ฅ ์์ด๋ ์ ์๋ํ๋๋ฐ, ๊ทธ๋ ๋ค๊ณ ํด์ Go๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์ ๋ถ์กฑํ ๊ฒ์ ์๋๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์, ๊ฐ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์๋ฒฝํ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ๊ฑฐ๋, ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ถ์กฑํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ์ ์ ๋ฉ์ถฐ ๋ณด์ธ์.
๋์ ์ ๋ ํจ์ํ ์ธ์ด์ ๋ช ๋ นํ ์ธ์ด๊ฐ โ๋๊ธฐโ๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ๋จผ์ ์์ ์์๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ๊ณ ์์ด์ ์ฅ๋ฅผ ์ํ ๋ ํจ์๋ ๊ฐ๊ฐ ๋ณ๊ฐ์ ์คํ ์ค๋ ๋๋ก ๋ณผ ์ ์์ต๋๋ค. ์ฝ๋์์ โฉ์ ํธ์ถํ ๋, ํ๋ก๊ทธ๋๋จธ๋ ๋ถ๋ช ํ ์ปดํจํฐ๊ฐ ์คํ์ ์ผ์์ ์ผ๋ก ์ค๋จํ๊ณ ๋์ค์ ๊ณ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค. ๋ชจ๋๋์ ๋ํด ์ง๋ฃจํ ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์ถ์ง ์์ผ๋, โํจ์ํโ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋ก๋ฏธ์ค[6]๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ๋๋ถ๋ถ์ ๋ ์๋ค์ด ์ถฉ๋ถํ ์ต์ํ ๊ฒ์ด๋ผ ์๊ฐ๋๋ ์ถ์ํ์ ๋๋ค.
function moveMouseBlocking() {
while (mouse.x < 200) {
mouse.x += 5;
sleep(10); // ๋ธ๋กํน sleep
}
}
function moveMouseAsync() {
return new Promise((resolve) => {
function iterate() {
if (mouse.x < 200) {
mouse.x += 5;
sleep(10).then(iterate); // ๋
ผ๋ธ๋กํน sleep
} else {
resolve();
}
}
iterate();
});
}
์ฌ๊ธฐ์ ๋ฐ๋ก ๋ฌธ์ ์ ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๋ธ๋กํน ์์ ๋ฅผ ๋ ผ๋ธ๋กํน ์์ ๋ก ๋ณํํ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ต๋ค๋ ์ ์ ๋๋ค. ๊ฐ์๊ธฐ ์ฐ๋ฆฌ์ ๋ฃจํ(๋๋ ์ค์ ๋ก ๋ชจ๋ ์ ์ด ํ๋ฆ)๋ฅผ ํํํ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๊ธฐ๋ฅผ ์ํํ๊ธฐ ์ํด ์ค์ผ์ค๋ฌ์ ์คํ๊ธฐ์ ๋์์ ๋ฐ์, ์๋์ผ๋ก ์ฌ๊ท ํจ์ ํธ์ถ ํํ๋ก ๋ถํดํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์คํ์ผ์ ๊ฒฐ๊ตญ ๋ค๋ฃจ๊ธฐ๊ฐ ๋ฒ๊ฑฐ๋ก์ ๋น๋๊ธฐ/๋๊ธฐ๊ฐ ๋์ ๋์๊ณ , ์ด๋ฅผ ํตํด ์ด์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋๋ถ๋ถ ๋์ฐพ์ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
async function moveMouseAsync() {
while (mouse.x < 200) {
mouse.x += 5;
await sleep(10);
}
}
ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์ค์ ๋ก ์๋ฌด๊ฒ๋ ๋ณํ ๊ฒ์ด ์์ต๋๋ค. ํนํ ์ด ํจ์๋ฅผ ํธ์ถํ ๋, ๋จ์ง โ์ฐ์ฐ์ ํฉ์ฑโ์ ํฌํจํ๋ ๊ฐ์ฒด๋ง ์ป๊ฒ ๋ฉ๋๋ค. ๊ทธ ๊ฐ์ฒด๋ ๊ฒฐ๊ด๊ฐ์ ์ต์ข ์ ์ผ๋ก ๊ฐ์ง๊ฒ ๋ ํ๋ก๋ฏธ์ค์ ๋๋ค. ์ค์ ๋ก C#๊ณผ ๊ฐ์ ์ผ๋ถ ์ธ์ด์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ์ฐ์์ ์ธ ํจ์ ํธ์ถ๋ก ๋ณํํฉ๋๋ค. ํ๋ก๋ฏธ์ค๋ฅผ ์ป๊ณ ๋๋ฉด, ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ด ์์ ์ด ์๋ฃ๋ ๋ ํธ์ถ๋ then๊ณผ ํจ๊ป ์ฝ๋ฐฑ์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋น๋๊ธฐ/๋๊ธฐ๋ ๊น๋ํ๊ฒ ์ ๋ฆฌ๋ ์ถ์ํ ๋ฐฉ์์ด๋ผ๋ ๊ฑธ ์ง๊ด์ ์ผ๋ก ์ ์ ์์ต๋๋ค. ํ๋ก๋ฏธ์ค์ ์ฝ๋ฐฑ์ ๋ํ ์ถ์ํ์ฃ . ํ์ง๋ง ์๋ฐํ ๋งํ๋ฉด, ์ฐ๋ฆฌ๊ฐ ์์ํ๋ ์ง์ ๋ณด๋ค ๋ ๋๋น ์ก์ต๋๋ค. ํํ๋ ฅ ์ธก๋ฉด์์ ์ค์ํ ๊ธฐ๋ฅ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ ๋กญ๊ฒ ์ค๋จํ ์ ์๊ฒ ๋์์ต๋๋ค.
์๋์ ๋ธ๋กํน ์ฝ๋์์๋ sleep
์ ํธ์ถํ ๋, ์๋ฌต์ ์ผ๋ก 0.01์ด ๋์ ์ค๋จ๋์์ต๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ํธ์ถ์์๋ ๊ฐ์ ์ผ์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ sleep
์์
์ โ๋๊ธฐโํด์ผ๋ง ํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ โ์ปฌ๋ฌ ํจ์โ[7]๋ฅผ ๊ฐ์ง๊ฒ ๋ ํต์ฌ์ ์ธ ์ด์ ์
๋๋ค. ๋๊ธฐ ํจ์์์๋ ๋๊ธฐ๋ฅผ ํ ์ ์์ผ๋ฏ๋ก, ๋น๋๊ธฐ ํจ์๋ง์ด ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ ์ง ๋ฌธ์ *
์์ ์์ ๋ ๋น๋๊ธฐ/๋๊ธฐ๊ฐ ์ผ์ผํค๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ง์ฝ resolve๊ฐ ์ ๋ ํธ์ถ๋์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ ๊ฒฐ๊ตญ ๋ฐํํ๊ณ , ์คํ์ด ํด์ ๋๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋ฉ๋๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์ธ๊ณ์์๋ ๋๊ตฐ๊ฐ๊ฐ ๋ง์ง๋ง์ resolve๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
๋ง์ฝ ๊ทธ๊ฒ์ด ์ ๋ ํธ์ถ๋์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ด๋ก ์ ์ผ๋ก๋ ์ด๊ฒ ์์ฒญ๋๊ฒ ๊ธด ์๊ฐ ๋์ ๋๊ธฐํ๋๋ก sleep()์ ํธ์ถํ๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์ ํ ๋ค์ด์ค์ง ์๋ ํ์ดํ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๊ณผ ๋น์ทํด ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์์ ํ ๋ค๋ฆ ๋๋ค. ํ์ชฝ์ ์ฝ ์คํ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ๊ณ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํด์ผ ํ์ง๋ง, ๋ค๋ฅธ ์ชฝ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ง ๋จ์์๊ณ ๋๋จธ์ง๋ ๋ค ์ ๋ฆฌ๋ ์ํ์์ ๊ฐ๋น์ง ์ปฌ๋ ์ [8]์ด ์์์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ฃ .
๊ณ์ฝ์์ผ๋ก๋ resolve๋ฅผ ๋ฐ๋์ ํธ์ถํด์ผ ํ๋ค๋ ๊ท์น์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ก ์ ์ผ๋ก ์๊ณ ์๋ฏ์ด v์ ์ง ๋ฌธ์ [9]๋ ๊ฒฐ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ๋๊ตฐ๊ฐ๊ฐ resolve๋ฅผ ํธ์ถํ ์ง ์ ํ ์ง ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ค์ ๋ก ์์ต๋๋ค.
๋๋ฌด ์ด๋ก ์ ์ผ๋ก ๋ณด์ผ ์๋ ์์ง๋ง, ์ด๋ ๋งค์ฐ ์ค์ํ ๋ฌธ์ ์ ๋๋ค. ํ๋ก๋ฏธ์ค/ํจ์ฒ์ ๋น๋๊ธฐ/๋๊ธฐ๋ ์ด๋ค์ด ์์ ๋๋ณด๋ค ์ํฉ์ ๋ ์ ํ์ํค๊ณ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋ก๋ฏธ์ค๋ฅผ ๊ฐ์ฅ ๋ํ์ ์ธ ์๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ๋ก๋ฏธ์ค๋ ๊ฒฐ๊ตญ resolve๋ฅผ ํธ์ถํ๊ฒ ๋ ์ต๋ช ํจ์์ ์ํด ์์ฑ๋ฉ๋๋ค.
let neverSettle = new Promise((resolve) => {
// ์ด ํจ์๋ ๋๋์ง๋ง, resolve๋ฅผ ์ ๋ ํธ์ถํ์ง ์์ต๋๋ค
});
๋จผ์ ๋ช ํํ ํ์๋ฉด, ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค๋ง, ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ฝ์ฃ . ์ด๊ฒ์ ์์ ํ ํฉ๋ฒ์ ์ธ ์ฝ๋์ ๋๋ค. ์ ๋ resolve๋์ง ์๋ ํ๋ก๋ฏธ์ค์ฃ . ์ด๊ฑด ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. ํ๋ก๋ฏธ์ค ์์ ์ต๋ช ํจ์๋ ๋ฐํ๋๊ณ , ์คํ์ ์ ๋ฆฌ๋๋ฉฐ, ์ฐ๋ฆฌ์๊ฒ๋ ๊ฒฐ๊ตญ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ โ๋๊ธฐ ์ค์ธโ ํ๋ก๋ฏธ์ค๋ง ๋จ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ ๋ฌธ์ ์ธ ์ด์ ๋ ์ ๋ resolve๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ธฐ๋ ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ข ๋ ์ ๋ณด์ฌ์ฃผ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ค์ ๋ก ๋์์ ์์ ํ ์ ์๋ ๊ฒ๋ค์ ์๋ฅผ ์ค์ด๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ต๋ 10๊ฐ์ ์์ ๋ง ๋์์ ์คํ๋๋๋ก ํ๋ ์์คํ ์ ์๊ฐํด ๋ด ์๋ค. ์ด๋ฅผ ์ํด ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ฌ 10๊ฐ์ ํ ํฐ์ ๋ฐ๊ธํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐฑํ๋ ์ ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const semaphore = new Semaphore(10);
async function execute(f) {
let token = await semaphore.acquire();
try {
await f();
} finally {
await semaphore.release(token);
}
}
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ๋ง์ฝ execute ํจ์์ ์ ๋ฌ๋ ํจ์๊ฐ neverSettle์ ๋ฐํํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ถ๋ช ํ ์ฐ๋ฆฌ๋ ์ธ๋งํฌ์ด ํ ํฐ์ ํด์ ํ์ง ๋ชปํ ๊ฒ์ ๋๋ค. ์ด๋ ๋ธ๋กํน ํจ์๋ค๊ณผ ๋น๊ตํ์ ๋ ํ์คํ ๋ ๋์ ์ํฉ์ ๋๋ค. ๊ฐ์ฅ ๋น์ทํ ์ํฉ์ ์์ฃผ ๊ธด ์๊ฐ ๋์ ์คํ๋๋ sleep์ ํธ์ถํ๋ ์ด๋ฆฌ์์ ํจ์์ผ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋์ ๋ค๋ฆ ๋๋ค.
ํ ๊ฒฝ์ฐ์๋ ์ฝ ์คํ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ์ด์์๊ฒ ์ ์งํ๊ณ , ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๊ฒฐ๊ตญ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ํ๋ก๋ฏธ์ค๋ง ๋จ๊ณ ๋ค์๋ ๋ณผ ์ ์๊ฒ ๋ฉ๋๋ค. ํ๋ก๋ฏธ์ค์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์ฌ์ค์ ์คํ์ด ์ ์ฉํ์ง ์๋ค๊ณ ๊ฒฐ์ ํ ์ ์ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ก๋ฏธ์ค๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ๋ ์๋ฆผ์ ๋ฐ์ ์ ์๊ฒ ํ๋ ๋ฑ์ ๋ฐฉ๋ฒ์ด ์์ฃ . ํ์ง๋ง ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์ ์ด ์์ต๋๋ค. ๊ท์น์์ผ๋ก๋ ์ด๋ฌํ ํ๋ก๋ฏธ์ค์ ๋์์ด ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ์ด๋ก ์ธํด ์ฐ๋ฆฌ๋ ์ด์ ์๋ ์์๋ ์๋ก์ด ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋์๋ค๋ ๊ฒ์ ๋๋ค.
ํ์ด์ฌ๋ ์ด์ ๊ฐ์ ๋ฌธ์ ์์ ์์ ๋กญ์ง ์์ต๋๋ค. Future ๊ฐ์ฒด๋ฅผ await ํ์ ๋, ํ๋ก๊ทธ๋จ์ ๊ฐ์ ์ข ๋ฃํ๊ธฐ ์ ๊น์ง๋ ๋ฌดํ์ ๋๊ธฐ ์ํ์ ๋น ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํด๊ฒฐ๋์ง ์์ ์ฑ๋ก ๋จ์์๋ ํ๋ก๋ฏธ์ค๋ ์ฝ ์คํ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ ๋ํ๋๋ฉฐ, ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋๋ผ๋ ๋ฐ์ํฉ๋๋ค. ์ค์ผ์ค๋ฌ๋ฅผ ํตํด ํจ์๋ค์ด ๋ถํด๋์ด ํธ์ถ๋๋ ํ๋ฆ์ ์ด์ ์ด๋ฌํ ๋น๋๊ธฐ ํธ์ถ๋ค์ ์์ ํ ์ฝ ์คํ์ผ๋ก ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ด์ ์๋ ์กด์ฌํ์ง ์์๋ ์ถ๊ฐ์ ์ธ ๋ฌธ์ ๋ค์ ๋ง๋ค์ด๋ ๋๋ค. ์ฝ ์คํ์ ์ ๋ง๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋๋ฒ๊น ์ ๋์์ด ๋๋ฉฐ ํ๋กํ์ผ๋ง์๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ธ๋กํน์ ํ๋์ ์ถ์ํ ๋ฐฉ์์ ๋๋ค
์, ์ด์ ์ฐ๋ฆฌ๋ ํ๋ก๋ฏธ์ค ๋ชจ๋ธ์ ์ ์ด๋ ๋ช ๊ฐ์ง ๊ณผ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ ์ถ์ํ ๋ฐฉ์์๋ ์ด๋ค ๊ฒ๋ค์ด ์์๊น์? ์ ๊ฐ ์ฃผ์ฅํ๊ณ ์ถ์ ๊ฒ์, ํจ์๊ฐ ์คํ ์ค๋ ๋๋ฅผ ์ผ์ ์ค๋จํ ์ ์๋ค๋ ๋ฅ๋ ฅ์ด ์ ๋ง๋ก ๋ฐ์ด๋ ๊ธฐ๋ฅ์ด์ ์ถ์ํ๋ผ๋ ์ ์ ๋๋ค. ์ ์ ์๊ฐํด ๋ณด์ธ์.
์ด๋์ ์๋ ์๊ด์์ด, ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ค๊ณ ๋งํ๊ณ ๋์ค์ ์ค๋จ๋ ์ง์ ๋ถํฐ ๋ค์ ๊ณ์ํ ์ ์๋ค๋ ๊ฑฐ์ฃ . ์ด๋ ํนํ ๋์ค์ ๋ฐฑํ๋ ์ ๊ฐ ํ์ํ๋ค๊ณ ํ๋จ๋ ๋ ์ด๋ฅผ ์ ์ฉํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ์ด์ฌ asyncio์์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ write๊ฐ ๋ ผ๋ธ๋กํน์ด๋ผ๋ ์ ์ ๋๋ค. ์ด ํจ์๋ ์์ํ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๊ณ , ๋ฒํผ ๋ธ๋กํธ[10]๋ฅผ ํผํ๊ธฐ ์ํด์๋ ๋ฐ๋์ await s.drain()์ ๋ฐ๋ก ํธ์ถํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์ถ์ํ๊ฐ ํนํ ์ค์ํ ์ด์ ๋ ํ์ค ์ธ๊ณ์์ ๋ชจ๋ ๊ฒ์ด ํญ์ ๋น๋๊ธฐ์ ์ด์ง ์์ผ๋ฉฐ, ๋ธ๋กํน[11]๋์ง ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ ๊ฒ๋ค์ด ์ค์ ๋ก๋ ๋ธ๋กํน๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ด์ฌ์ด ์ค๊ณ๋ ๋น์ write๊ฐ ๋ธ๋กํน๋ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์๋ ๊ฒ์ฒ๋ผ ๋ง์ ๋๋ค. ์ด์ ๊ด๋ จํ์ฌ ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์์๋ฅผ ๋ค์ด๋ณด๊ณ ์ ํฉ๋๋ค. ๋ค์ ์ฝ๋์์ ๋ฌด์์ด ์ฐจ๋จ๋๋ฉฐ, ๊ทธ ์ด์ ๋ ๋ฌด์์ผ๊น์?
def decode_object(idx):
header = indexes[idx]
object_buf = buffer[header.start:header.start + header.size]
return brotli.decompress(object_buf)
์ด๋ ์ผ์ข ์ ์์์ ๊ฐ์ ์ง๋ฌธ์ด์ง๋ง, ์ฌ์ค ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด ์ฝ๋๊ฐ ๋ธ๋กํน๋๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์์ฒด๊ฐ ๋ธ๋กํน๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๊ฒ ์๊ฐํ์ง ์์ผ์ จ์ ์๋ ์์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ๋ช ๋ฐฑํ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ์ ๋๋ค. ์์ง ๋ก๋๋์ง ์์ ํ์ด์ง์ ์ ๊ทผํ๋ฉด, ์ด์์ฒด์ ๋ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. "await touching this memory"์ ๊ฐ์ ํํ์ ์์ต๋๋ค. ๋ง์ฝ ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ณณ์์ ๋๊ธฐ๋ฅผ ํด์ผ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ์ฌ์ํด ๋ณด์ผ ์ ์์ง๋ง, ์ผํธ๋ฆฌ(Sentry)[12]์์ ๋ฐ์ํ ์ฌ๋ฌ ์ฌ๊ณ ์ ์์ธ์ด ๋ฐ๋ก ๋ธ๋กํน๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ์์ต๋๋ค.
๋น๋๊ธฐ/๋๊ธฐ๊ฐ ์ค๋๋ ์ทจํ๋ ํํ์ ์ ๋ชจ๋ ๊ฒ์ด ๋ธ๋กํน๋๊ฑฐ๋ ์ผ์ ์ค๋จ๋ ํ์๋ ์๋ค๋ ์๊ฐ์ ๊ธฐ๋ฐํฉ๋๋ค. ํ์ง๋ง ํ์ค์์ ์ ๊ฐ ๋ฐ๊ฒฌํ ๋ฐ๋ก๋, ์ค์ ๋ก๋ ๋ ๋ง์ ๊ฒ๋ค์ด ์ผ์ ์ค๋จ๋๊ธฐ๋ฅผ ์ํ๊ณ , ๋ง์ฝ ์์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ ์ผ์ ์ค๋จ์ด ํ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด, ๊ณผ์ฐ ์ด๋ฐ ์ถ์ํ๊ฐ ์๋ฏธ๊ฐ ์์๊น์?
๊ทธ๋์ ์ด์ฉ๋ฉด ์ฒ์๋ถํฐ ๋ชจ๋ ํจ์ ํธ์ถ์ด ๋ธ๋กํน๋๊ณ ์ผ์ ์ค๋จ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ถ์ํ์์์ง๋ ๋ชจ๋ฆ ๋๋ค. ํ์ง๋ง ๊ทธ๋ฌ๋ฉด ์ด์ ์ค๋ ๋ ์์ฑ์ ๊ดํด ์ด์ผ๊ธฐํด์ผ ํฉ๋๋ค. ๋จ์ผ ์ค๋ ๋๋ง์ผ๋ก๋ ํฐ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋น๋๊ธฐ/๋๊ธฐ ์์คํ ์ด ์ ๊ณตํ๋ ํน๋ณํ ์ฅ์ ์ ๋ ๊ฐ์ง ์์ ์ ๋์์ ์คํํ๋๋ก ์ง์ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
๋น๋๊ธฐ ์์ ์ ์์ํ๊ณ ๋์ค์ awaitํ๋ ๊ฒ์ ๋ฏธ๋ฃธ์ผ๋ก์จ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ฃ . ์ด ์ ์์๋ ๋น๋๊ธฐ/๋๊ธฐ์ ์ฅ์ ์ ์ธ์ ํ ์๋ฐ์ ์์ต๋๋ค. ๋์ ์คํ์ด๋ผ๋ ํ์ค์ ์ธ์ด ์์ฒด์ ๋ น์ฌ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. Scratch ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋์์ฑ์ด ๊ทธํ ๋ก ์์ฐ์ค๋ฌ์ด ์ด์ ๋ ๋ฐ๋ก ๊ฑฐ๊ธฐ์ ์๊ธฐ ๋๋ฌธ์ด๊ณ , ๋น๋๊ธฐ/๋๊ธฐ๋ ์ฌ๊ธฐ์ ๋งค์ฐ ๋น์ทํ ๋ชฉ์ ์ ํด๊ฒฐํ๊ณ ์์ต๋๋ค.
์ ํต์ ์ธ ์ค๋ ๋ ๊ธฐ๋ฐ์ ๋ช ๋ นํ ์ธ์ด์์๋, ์ค๋ ๋๋ฅผ ์์ฑํ๋ ํ์๊ฐ ๋ณดํต (์ข ์ข ๋ณต์กํ) ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ๋ค์ ์จ๊ฒจ์ ธ ์์ต๋๋ค. ๋ ์ฑ๊ฐ์ ์ ์ ์ค๋ ๋๊ฐ ๋งค์ฐ ์ด์ํ๊ฒ ๋ถ์ด์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๊ณ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ ์๋ ์์ ํ ๋ถ์ ์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ํ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ์ค๋ ๋๋ฅผ ์กฐ์ธํ๊ณ , ์ค๋ ๋ ๊ฒฝ๊ณ๋ฅผ ๋์ด ๊ฐ์ ์ ๋ฌํ๋ฉฐ(์๋ฌ๋ ํฌํจํด์), ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ํค๋ณด๋ ์ ๋ ฅ, ๋ฉ์์ง ์ ๋ฌ ๋ฑ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ด ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํด๋์ ์ค๋ ๋ฉ*
์ ์ ์ค๋ ๋์ ์ง์คํด ๋ณด๊ฒ ์ต๋๋ค. ์์ ๋งํ๋ฏ์ด, ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ ๋ชจ๋ ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์ค๋จํ ์ ์๋ ๋ฅ๋ ฅ์ ๋๋ค. ์ค๋ ๋๊ฐ ๋ฐ๋ก ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ค๋ ๋๋ฅผ ์ด์ผ๊ธฐํ ๋, ๋ฐ๋์ ํน์ ํ ์ข ๋ฅ์ ์ค๋ ๋ ๊ตฌํ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค. ์์ ํ๋ก๋ฏธ์ค ์์ ๋ฅผ ์ ์ ์๊ฐํด ๋ณด์ธ์. โsleepโ์ด๋ผ๋ ๊ฐ๋ ์ด ์์์ง๋ง, ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง๋ ์ค์ ๋ก ๋งํ์ง ์์์ต๋๋ค. ๋ถ๋ช ํ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ๊ฐ ์์ง๋ง, ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง๋ ์ธ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ค๋ ๋๋ ๊ทธ๋ด ์ ์์ต๋๋ค. ์ค์ OS ์ค๋ ๋์ผ ์๋ ์๊ณ , ๊ฐ์์ผ ์๋ ์์ผ๋ฉฐ ํ์ด๋ฒ[13]๋ ์ฝ๋ฃจํด[14]์ผ๋ก ๊ตฌํ๋ ์๋ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ธ์ด๊ฐ ์ ๋๋ก ๊ตฌํํ๋ค๋ฉด ๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค.
์ด๊ฒ ์ค์ํ ์ด์ ๋, ์ ๊ฐ โ์ผ์ ์ค๋จโ์ด๋ โ๋ค๋ฅธ ๊ณณ์์ ์ด์ด์ ์คํโ์ ์ธ๊ธํ ๋ ๋ฐ๋ก ์ฝ๋ฃจํด๊ณผ ํ์ด๋ฒ๊ฐ ๋ ์ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค์ด ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ฃ . ํ์ง๋ง ์ ์ ๋ค๋ก ๋ฌผ๋ฌ์์ ๊ทธ๊ฒ๋ค์ด ์ด๋ป๊ฒ ๊ตฌํ๋๋์ง๋ ์๊ฐํ๋ ๊ฒ์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ํด ์๊ฐํด ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฐ๋ฆฌ์๊ฒ๋ ์ด๋ ๊ฒ ๋งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋์์ ์คํํ๋, ๋ฐํ์ ๊ธฐ๋ค๋ฆฌ์ง ๋ง๊ณ ๋์ค์(๋๋ ์ ๋) ๊ธฐ๋ค๋ฆฌ์. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ์ผ๋ถ ์ธ์ด์์ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๋ ๋๊ธฐํ์ง ์๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ๋ค์ ๋งํด์ ํจ์ ํธ์ถ์ ์์ฝํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์คํฌ๋์น๋ฅผ ์๊ฐํด ๋ณด๋ฉด, ๋์์ฑ์ด ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง๋ ์ด์ ์ค ํ๋๋ ๊ทธ๊ฒ์ด ์ ๋ง ์ ํตํฉ๋์ด ์๊ณ ์ธ์ด์ ํต์ฌ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ์ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์์ต๋๋ค. ๊ณ ๋ฃจํด์ ๊ฐ์ง Go์ด๋ฉฐ, ์ด๋ฅผ ์ํ ๋ฌธ๋ฒ์ด ์์ฃ .
์ด์ ์ฐ๋ฆฌ๋ ์์ฑํ ์ ์๊ณ , ๊ทธ๊ฒ์ด ์คํ๋ฉ๋๋ค. ํ์ง๋ง ์ด์ ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค. ๋๊ธฐํ, ๋๊ธฐ, ๋ฉ์์ง ์ ๋ฌ ๋ฑ ๋ชจ๋ ๊ฒ๋ค์ด ํด๊ฒฐ๋์ง ์์์ต๋๋ค. ์คํฌ๋์น์กฐ์ฐจ๋ ์ด์ ๋ํ ๋ต์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถ๋ช ํ ์ด๊ฒ์ด ์๋ํ๊ฒ ํ๊ธฐ ์ํด์๋ ๋ญ๊ฐ๊ฐ ๋ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ฑ ํธ์ถ์ ๋๋์ฒด ๋ฌด์์ ๋ฐํํ๋ ๊ฑธ๊น์?
๋น๋๊ธฐ๋ ๋ฌด์์ธ๊ฐ?
๋น๋๊ธฐ/๋๊ธฐ์๋ ํ๋์ ์์ด๋ฌ๋๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ๋ฌ ์ธ์ด์ ์กด์ฌํ๊ณ , ํ๋ฉด์ ์ผ๋ก๋ ์์ ํ ๋์ผํด ๋ณด์ด์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ์์ ํ ๋ค๋ฅด๊ฒ ์๋ํ๋ค๋ ์ ์ ๋๋ค. ๊ฒ๋ค๊ฐ ๊ฐ ์ธ์ด์์ ๋น๋๊ธฐ/๋๊ธฐ์ ๋์ ๋ฐฐ๊ฒฝ๋ ์๋ก ๋ค๋ฆ ๋๋ค.
์์ ์ ๊ฐ ์ธ๊ธํ๋ฏ์ด, ์์๋ก ๋ธ๋กํนํ ์ ์๋ ์ฝ๋๋ ์ผ์ข ์ ์ถ์ํ์ ๋๋ค. ์ด ์ถ์ํ๊ฐ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ฏธ๊ฐ ์์ผ๋ ค๋ฉด, ๋ธ๋กํนํ๋ ๋์์ CPU ์๊ฐ์ ๋ค๋ฅธ ์ ์ฉํ ์์ ์ ํ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ํํธ์ผ๋ก๋ ์ปดํจํฐ๊ฐ ์์ฐจ์ ์ผ๋ก๋ง ์ผ์ ์ฒ๋ฆฌํ๋ฉด ์ง๋ฃจํ ํ ๊ณ , ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์์ ์ ๋ณ๋ ฌ๋ก ์คํํด์ผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ก์ ์ฐ๋ฆฌ๋ ๋๋๋ก ๊ณ์ ์งํํ๊ธฐ ์ ์ ๋ ๊ฐ์ง ์ผ์ ๋์์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ ๋ง์ ์ค๋ ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ฑ์ฅํ์ฃ . ํ์ง๋ง ์ค๋ ๋๊ฐ ๊ทธ๋ ๊ฒ ์ข๋ค๋ฉด, ์ ์ฌ๋ฌ ์ธ์ด์ ๋น๋๊ธฐ/๋๊ธฐ์ ๊ธฐ๋ฐ์ด ๋๋ ์ฝ๋ฃจํด๊ณผ ํ๋ก๋ฏธ์ค์ ๋ํด ๊ทธํ ๋ก ์ด์ผ๊ธฐํ๋ ๊ฑธ๊น์?
์ ๊ฐ ์๊ฐํ๊ธฐ์ ์ด ์ง์ ์์ ์ด์ผ๊ธฐ๊ฐ ๋น ๋ฅด๊ฒ ๋ณต์กํด์ง๊ธฐ ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ์ด์ฌ, C#, ๋ฌ์คํธ์๋ ์์ ํ ๋ค๋ฅธ ๊ณผ์ ๋ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ๋ ์ด์ฉ์ง ์ด ๋ชจ๋ ์ธ์ด๋ค์ด ๊ฒฐ๊ตญ ๋น๋๊ธฐ/๋๊ธฐ ํํ๋ฅผ ๊ฐ๊ฒ ๋์์ฃ .
์๋ฐ์คํฌ๋ฆฝํธ
์๋ฐ์คํฌ๋ฆฝํธ๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ์ค์ฝํ๊ฐ ๋ฐํํ ์ ์๋ ๋จ์ผ ์ค๋ ๋ ์ธ์ด์ ๋๋ค. ์ธ์ด์๋ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ด ์์ผ๋ฉฐ ์ค๋ ๋๋ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น๋๊ธฐ/๋๊ธฐ ์ด์ ์๋ ์ฝ๋ฐฑ ์ง์ฅ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ์ด ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ์๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ๋ ๊ทธ ํ์ ๊ทธ๊ฒ์ ์ํ ๋ฌธ๋ฒ์ ์คํ์ด ๋์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ค๋ฅธ ์ ํ๊ถ์ด ๋ง์ง ์์๋ ์ด์ ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ธ์ด ๋ณ๊ฒฝ ์์ด ๋ฌ์ฑํ ์ ์๋ ์ ์ผํ ๊ฒ์ด์๊ณ , ๋น๋๊ธฐ/๋๊ธฐ๋ ๋ณํ ๋จ๊ณ๋ก ๊ตฌํ๋ ์ ์๋ ๊ฒ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ ์ค์ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ค๋ ๋๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ฌ๋ฏธ์๋ ์ผ์ด ๋ฐ์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ธ์ด ์์ค์์ ๋์์ฑ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. setTimeout์ ํธ์ถํ๋ฉด, ๋ฐํ์์๊ฒ ๋์ค์ ํจ์๋ฅผ ํธ์ถํ๋๋ก ์ค์ผ์ค๋งํ๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํนํ ์์ฑ๋ ํ๋ก๋ฏธ์ค๋ ์๋์ผ๋ก ์ค์ผ์ค๋ง ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์์ด๋ฒ๋ฆฌ๋๋ผ๋ ์คํ๋ ๊ฒ์ ๋๋ค.
ํ์ด์ฌ
๋ฐ๋ฉด์ ํ์ด์ฌ์ ์์ ํ ๋ค๋ฅธ ๋์ ๋ฐฐ๊ฒฝ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ ์ด์ ์๋์, ํ์ด์ฌ์ ์ด๋ฏธ ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค - ์ค์ ์ด์์ฒด์ ์์ค์ ์ค๋ ๋์์ฃ . ํ์ง๋ง GIL(Global Interpreter Lock)[15] ๋๋ฌธ์ ์ด๋ฌํ ์ค๋ ๋๋ค์ด ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ต๋๋ค. ๋ฌผ๋ก ์ด๋ ๋จ์ง ํ๋์ ์ฝ์ด ์ด์์ผ๋ก ํ์ฅ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ ๋ฟ์ด๋ฏ๋ก, ์ ์ ๊ทธ๊ฒ์ ๋ฌด์ํ๋๋ก ํ๊ฒ ์ต๋๋ค. ํ์ด์ฌ์ ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์๊ธฐ ๋๋ฌธ์, ๊ฝค ์ผ์ฐ๋ถํฐ ํ์ด์ฌ์์ ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ตฌํํ๋ ์คํ์ด ์์์ต๋๋ค. ๋น์์๋(๊ทธ๋ฆฌ๊ณ ์ด๋ ์ ๋ ์ง๊ธ๋) OS ์์ค ์ค๋ ๋์ ๋น์ฉ์ด ๊ฝค ๋์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์ค๋ ๋๋ ์ด๋ฌํ ๋์ ์คํ ๊ฐ์ฒด๋ค์ ๋ ๋ง์ด ์์ฑํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฒจ์ก์ต๋๋ค.
ํ์ด์ฌ์์ ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์์ต๋๋ค. ํ๋๋ ์คํ๋ ์ค[16] ํ์ด์ฌ ํ๋ก์ ํธ์๋๋ฐ, ์ด๋ ํ์ด์ฌ์ ๋์ฒด ๊ตฌํ(์ ํํ๋ cํ์ด์ฌ์ ๋ํ ๋ง์ ํจ์น๋ค)์ผ๋ก โ์คํ๋ฆฌ์ค ๊ฐ์๋จธ์ (๊ธฐ๋ณธ์ ์ผ๋ก C ์คํ์ ์ ์งํ์ง ์๋ ๊ฐ์๋จธ์ )โ์ ๊ตฌํํ์ต๋๋ค. ๊ฐ๋จํ ๋งํด์, ์ด๋ฅผ ํตํด ์คํ๋ ์ค๊ฐ โtaskletโ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๊ตฌํํ ์ ์์๋๋ฐ, ์ด๋ ์ค๋จ๋๊ณ ์ฌ๊ฐ๋ ์ ์๋ ํจ์๋ค์ด์์ต๋๋ค. ์คํ๋ ์ค๋ ๋ฐ์ ๋ฏธ๋๋ฅผ ๊ฐ์ง ๋ชปํ๋๋ฐ, ์คํ๋ฆฌ์ค ํน์ฑ ๋๋ฌธ์ ํ์ด์ฌ > C > ํ์ด์ฌ ํธ์ถ์ด ๊ต์ฐจ๋๋ฉด์ ์คํ์์ ์ค๋จ๋ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ด์ฌ์์์ ๋ ๋ฒ์งธ ์๋๋ โgreenletโ์ด๋ผ๊ณ ๋ถ๋ ธ์ต๋๋ค. greenlet์ ์๋ ๋ฐฉ์์ ์ฌ์ฉ์ ์ ์ ํ์ฅ ๋ชจ๋์์ ์ฝ๋ฃจํด์ ๊ตฌํํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ตฌํ์ด ๊ฝค ๊น๋ค๋ก์ ์ง๋ง, ํ๋ ฅ์ ๋ฉํฐํ์คํน์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค. ํ์ง๋ง ์คํ๋ ์ค์ฒ๋ผ, ์ด๊ฒ๋ ์น๋ฆฌํ์ง ๋ชปํ์ต๋๋ค. ๋์ ์ค์ ๋ก ์ผ์ด๋ ์ผ์ ํ์ด์ฌ์ด ์๋ ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๋๋ ์ดํฐ ์์คํ ์ด ์ ์ง์ ์ผ๋ก ์ฝ๋ฃจํด ์์คํ ์ผ๋ก ์ ๊ทธ๋ ์ด๋๋์๊ณ , ๋ฌธ๋ฒ ์ง์๊ณผ ํจ๊ป ๋น๋๊ธฐ ์์คํ ์ด ๊ทธ ์์ ๊ตฌ์ถ๋์์ต๋๋ค.
์ด๋ก ์ธํ ๊ฒฐ๊ณผ ์ค ํ๋๋ ์ฝ๋ฃจํด์์ ์ค๋จํ๊ธฐ ์ํด ๋ฌธ๋ฒ์ ์ง์์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ํธ์ถ๋์์ ๋, ์ค์ผ์ค๋ฌ์ ์๋ณดํ๋ sleep๊ณผ ๊ฐ์ ํจ์๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ต๋๋ค. await๋ฅผ ํด์ผ๋ง ํ์ฃ (๋๋ ์ด๊ธฐ์๋ yield from์ ์ฌ์ฉํ ์ ์์์ต๋๋ค). ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํ์ด์ฌ์์ ์ฝ๋ฃจํด์ด ๋ด๋ถ์ ์ผ๋ก ์๋ํ๋ ๋ฐฉ์ ๋๋ฌธ์ ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ๊ฐ๊ฒ ๋์์ต๋๋ค. ์ด์ ๋ํ ๋๊ธฐ๋ ๋ฌด์ธ๊ฐ๊ฐ ์ค๋จ๋ ๋ ์ ์ ์๋ค๋ ๊ฒ์ด ๊ธ์ ์ ์ธ ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ก๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ด์ฌ ์ฝ๋ฃจํด ๋ชจ๋ธ์ ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ฒฐ๊ณผ๋ ์ ์ด๋ ์ฝ๋ฃจํด ๋ชจ๋ธ์์๋ OS ์์ค์ ์ค๋ ๋๋ฅผ ๋์ด์ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํ ์ค๋ ๋์์ ์ฝ๋ฃจํด์ ๋ง๋ค์ด ๋ค๋ฅธ ์ค๋ ๋๋ก ๋ณด๋ด์ ๊ฑฐ๊ธฐ์ ๊ณ์ ์คํํ ์ ์์ต๋๋ค. ์ค์ ๋ก๋ IO ์์คํ ๊ณผ ์ฐ๊ฒฐ๋๋ฉด ๋ค๋ฅธ ์ค๋ ๋์ ์ด๋ฒคํธ ๋ฃจํ๋ก ๋ ์ด์ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฏธ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์์ ํ ๋ค๋ฅธ ์ผ์ ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ ์ด๋ ์ด๋ก ์ ์ผ๋ก๋ ์ค๋ ๋ ๊ฐ์ ์ด๋ํ ์ ์๊ณ , ์ค๋ ๋๊ฐ ์์ผ๋ฉฐ, yield๋ฅผ ์ํ ๋ฌธ๋ฒ์ด ์์ต๋๋ค. ํ์ด์ฌ์ ์ฝ๋ฃจํด์ ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ฌ๋ฆฌ ์คํ๋์ง ์์ ์ํ๋ก ์์ํฉ๋๋ค. ์ด๋ ๋ถ๋ถ์ ์ผ๋ก ํ์ด์ฌ์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ต์ฒดํ ์ ์๊ณ ์๋ก ํธํ๋์ง ์๋ ๊ตฌํ์ด ์๊ธฐ ๋๋ฌธ์ด๊ธฐ๋ ํฉ๋๋ค.
C#
๋ง์ง๋ง์ผ๋ก C#์ ๋ํด ์ด์ผ๊ธฐํด ๋ณผ๊ฒ์. ์ฌ๊ธฐ์๋ ๋์ ๋ฐฐ๊ฒฝ์ด ์์ ํ ๋ค๋ฆ ๋๋ค. C#์๋ ์ค์ ์ค๋ ๋๊ฐ ์์ต๋๋ค. ์ค๋ ๋๊ฐ ์์ ๋ฟ๋ง ์๋๋ผ, ๊ฐ์ฒด๋ณ ์ ๊ธ๋ ์๊ณ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ ์ ํ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด์ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ป์ ์๋๋๋ค. ํ์ค์ ์ผ๋ก ์ค๋ ๋๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ค๋ ๋ ๊ฐ์ ๋๊ธฐํํ๊ณ ํต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฉฐ, ๋๋ก๋ ๊ทธ๋ฅ ๊ธฐ๋ค๋ ค์ผ ํ ๋๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ๊ทธ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ๋ค๋ฅธ ์์ ์ ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์๊ฐ์ด ์ง๋๋ฉด์ .NET์ ๋น๋๊ธฐ ์์ ์ ๋ํ ์ถ์ํ์ธ task[17]๋ฅผ ๋์ ํ์ต๋๋ค. ์ด๊ฒ๋ค์ .NET ์ค๋ ๋ฉ ์์คํ ์ ์ผ๋ถ์ด๋ฉฐ, ์ด์ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ๋ฒ์ ์ฌ์ฉํด task์์ ์ค๋จํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. .NET์ ํ์ฌ ์ค๋ ๋์์ task๋ฅผ ์คํํ๋ฉฐ, ๋ธ๋กํนํ๋ ๊ฒฝ์ฐ ๊ณ์ ๋ธ๋กํน๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.
์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๊ฝค ๋ค๋ฅธ๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์๋ก์ด ์ค๋ ๋๊ฐ ์์ฑ๋์ง ์์ง๋ง ์ค์ผ์ค๋ฌ์์ ์คํ์ด ๋ณด๋ฅ๋ฉ๋๋ค. .NET์์ ์ด๋ ๊ฒ ์๋ํ๋ ์ด์ ๋ ์ด ์์คํ ์ ์ผ๋ถ ๋๊ธฐ๊ฐ ๋ฉ์ธ UI ์ค๋ ๋๋ฅผ ๋ธ๋กํนํ์ง ์๊ณ , ์ ๊ทผํ ์ ์๊ฒ ํ๋ ๊ฒ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ๊ทธ ๊ฒฐ๊ณผ๋ก, ์ค์ ๋ก ๋ธ๋กํนํ๋ฉด ๋ฌด์ธ๊ฐ๋ฅผ ๋ง์น๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๋ฐ๋ก ์ ์ด๋ ํ๋ C#์ด await๋ฅผ ๋ง๋ ๋๋ง๋ค ํจ์๋ฅผ ์ฐ์์ ์ธ ํด๋ก์ ๋ก ๋ถํ ํ๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋จ์ํ ํ๋์ ๋ ผ๋ฆฌ์ ์ฝ๋ ์กฐ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ๋ณ๋ ํจ์๋ก ๋ถํดํ๋ ๊ฒ์ด์ฃ .
๋ฌ์คํธ์ ๋ํด ๊น์ด ๋ค์ด๊ฐ๊ณ ์ถ์ง๋ ์์ง๋ง, ๋ฌ์คํธ์ ๋น๋๊ธฐ ์์คํ ์ ์๋ง๋ ๊ทธ๋ค ์ค ๊ฐ์ฅ ์ด์ํ ๊ฒ์ผ ๊ฒ๋๋ค. ์๋ํ๋ฉด ํด๋ง ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๋จํ ๋งํด์: ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ์ ๊ทน์ ์ผ๋ก "๊ธฐ๋ค๋ฆฌ์ง" ์๋ ํ, ์งํ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ผ์ค๋ฌ์ ๋ชฉ์ ์ ์์ ์ด ์ค์ ๋ก ์งํ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๋ฌ์คํธ๊ฐ ์ ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ์ฑํํ์๊น์? ์ฃผ๋ก ๋ฐํ์๊ณผ ์ค์ผ์ค๋ฌ ์์ด๋ ์๋ํ๋ ๊ฒ์ ์ํ๊ณ , ์์ ๊ถ ๊ฒ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ ํ ๋๋ฌธ์ด์์ต๋๋ค.
์ด ๋ชจ๋ ์ธ์ด ์ค์์, ์ ๊ฐ ์๊ฐํ๊ธฐ์ ๋น๋๊ธฐ/๋๊ธฐ์ ๋ํ ๋ ผ๊ฑฐ๋ ๋ฌ์คํธ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ๊ฐ๋ ฅํฉ๋๋ค. ๋ฌ์คํธ๋ ์์คํ ์ธ์ด์ด๊ณ ์ ํ๋ ๋ฐํ์์ผ๋ก ์๋ํ๋ ๋์์ธ์ ์ํ๊ธฐ ๋๋ฌธ์ด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ ์ค๋ ๋๊ฐ ์์ด์ ๋น๋๊ธฐ/๋๊ธฐ์ ๋์์ ์ฝ๋ฐฑ๋ฟ์ด์๊ธฐ ๋๋ฌธ์ ์ดํด๊ฐ ๋ฉ๋๋ค.
ํ์ง๋ง C#์ ๊ฒฝ์ฐ ๋ ผ๊ฑฐ๊ฐ ํจ์ฌ ์ฝํด ๋ณด์ ๋๋ค. UI ์ค๋ ๋์์ ์ฝ๋๋ฅผ ์คํํ๋๋ก ๊ฐ์ ํด์ผ ํ๋ ๋ฌธ์ ๋ ๊ฐ์ ์ค๋ ๋์ ๋ํ ์ค์ผ์ค๋ง ์ ์ฑ ์ ๊ฐ์ง์ผ๋ก์จ ํด๊ฒฐ๋ ์ ์์์ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์ ๊ฐ์ฅ ๋์ ์ฌ๋ก๋ ํ์ด์ฌ์ ๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งค์ฐ ๋ณต์กํ ์์คํ ์ด ๋์๊ณ , ์ด์ ์ธ์ด๋ ์ฝ๋ฃจํด๊ณผ ์ค์ ์ค๋ ๋, ๊ฐ๊ฐ์ ๋ํ ์๋ก ๋ค๋ฅธ ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ค, ๊ทธ๋ฆฌ๊ณ ํ๋์ OS ์ค๋ ๋์ ๊ณ ์ ๋ ๋น๋๊ธฐ ์์ ๋ค์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค. ์ฌ์ง์ด ์ธ์ด๋ ์ค๋ ๋์ ๋น๋๊ธฐ ์์ ์ ์ํ ์๋ก ๋ค๋ฅธ ํจ์ฒ๋ค์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ๊ฐ ์ฌ๋ฌ๋ถ์ด ์ด ๋ชจ๋ ๊ฒ์ ์ดํดํ๊ธฐ๋ฅผ ์ํ๋ ์ด์ ๋ ์ด ๋ชจ๋ ๋ค๋ฅธ ์ธ์ด๋ค์ด ๊ฐ์ ๋ฌธ๋ฒ์ ๊ณต์ ํ์ง๋ง, ๊ทธ๊ฒ์ผ๋ก ํ ์ ์๋ ์ผ์ ์์ ํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ค์ด ๊ณตํต์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋น๋๊ธฐ ํจ์๋ ๋น๋๊ธฐ ํจ์์ ์ํด์๋ง ํธ์ถ๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค(๋๋ ์ค์ผ์ค๋ฌ์ ์ํด).
๋น๋๊ธฐ๊ฐ ์๋ ๊ฒ
์ง๋ ๋ช ๋ ๋์ ์ ๋ ํ์ด์ฌ์ด ์ ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ์ฑํํ๊ฒ ๋์๋์ง์ ๋ํ ๋ง์ ์ฃผ์ฅ์ ๋ค์๊ณ , ์ ๊ด์ ์์ ๋ณผ ๋ ์ ์๋ ์ผ๋ถ ์ฃผ์ฅ๋ค์ ๋ฉด๋ฐํ ๊ฒํ ๋ฅผ ๊ฒฌ๋์ง ๋ชปํฉ๋๋ค. ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ํ ๊ฐ์ง ์ฃผ์ฅ์ ์ค๋จ ์์ ์ ์ ์ดํ ์ ์๋ค๋ฉด, ์ ๊ธ์ด๋ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ถ ์ง์ค์ด ์์ง๋ง(์์๋ก ์ค๋จ๋์ง ์์), ์ฌ์ ํ ์ ๊ธ์ ํด์ผ ํฉ๋๋ค. ์ฌ์ ํ ๋์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๋ณดํธํด์ผ ํฉ๋๋ค. ํ์ด์ฌ์์๋ ์ด๊ฒ์ด ํนํ ๋ถ๋ง์ค๋ฌ์ด๋ฐ, ์์ด ์๋ ํจ์๋ฟ๋ง ์๋๋ผ ์์ด ์๋ ์ ๊ธ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ค๋ ๋๋ฅผ ์ํ ์ ๊ธ๊ณผ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ํ ์ ๊ธ์ด ์์ผ๋ฉฐ, ์ด๋ค์ ์๋ก ๋ค๋ฆ ๋๋ค.
์ ๊ฐ ์์์ ์ธ๋งํฌ์ด ์์ ๋ฅผ ๋ณด์ฌ์ค ๋ฐ๋ ๊ทธ๋ด๋งํ ์ด์ ๊ฐ ์์ต๋๋ค. ์ธ๋งํฌ์ด๋ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ ๋ก ์กด์ฌํฉ๋๋ค. ์์คํ ์ด ๋๋ฌด ๋ง์ ์์ ์ ๋ฐ์๋ค์ด์ง ์๋๋ก ๋ณดํธํ๊ธฐ ์ํด ์์ฃผ ํ์ํฉ๋๋ค. ์ค์ ๋ก ๋ง์ ๋น๋๊ธฐ/๋๊ธฐ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ๋ค์ด ๊ฒช๋ ํต์ฌ์ ์ธ ๋ฌธ์ ์ค ํ๋๋ ๋ฐฑํ๋ ์ ๋ฅผ ํ์ฌํ ์ ์์ด์ ๋ฒํผ๊ฐ ๋ถํ์ด ์ค๋ฅด๋ ๊ฒ์ด์ฃ (์ด์ ๋ํด ๋ค๋ฃฌ ๊ธ). ์ ๊ทธ๋ด๊น์? API๊ฐ ๋น๋๊ธฐ๊ฐ ์๋๋ผ๋ฉด ๋ฒํผ๋งํ๊ฑฐ๋, ์คํจํ๋๋ก ๊ฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ธ๋กํนํ ์๋ ์์ต๋๋ค.
๋น๋๊ธฐ๋ ๋ํ ํ์ด์ฌ์ GIL ๋ฌธ์ ๋ฅผ ๋ง๋ฒ์ฒ๋ผ ํด๊ฒฐํ์ง๋ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ ์ค๋ ๋๊ฐ ๋ง๋ฒ์ฒ๋ผ ์๊ธฐ๊ฒ ํ์ง๋ ์๊ณ , ์์์ ์ฝ๋๊ฐ ๋ธ๋กํน์ ์์ํ ๋์ ๋ฌธ์ (๊ทธ๋ฆฌ๊ณ ๊ธฐ์ตํ์ธ์, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์กฐ์ฐจ๋ ๋ธ๋กํน๋ ์ ์์ต๋๋ค)๋ ๋งค์ฐ ๋๋ฆฌ๊ฒ ํฐ ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํ ๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ์์ต๋๋ค.
์ค๋ ๋๊ฐ ๋ต?
์์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด, ์ฐ๋ฆฌ๊ฐ โ์์์ ์์ ์์ ์ค๋จโํ ์ ์๋ ๊ฒ์ ๋ํด ์๊ฐํ ๋, ํ๋ก๊ทธ๋๋จธ๋ค์ ์ข ์ข ๋ฐ๋ก ์ฝ๋ฃจํด์ ๋ ์ฌ๋ฆฝ๋๋ค. ๊ทธ๋ด ๋งํ ์ด์ ๊ฐ ์์ฃ : ์ฝ๋ฃจํด์ ๋๋๊ณ , ์ฌ๋ฏธ์์ผ๋ฉฐ, ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๊ฐ์ ธ์ผ ํ ๊ธฐ๋ฅ์ ๋๋ค.
์ฝ๋ฃจํด์ ์ค์ํ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ๋ฏธ๋์ ์ธ์ด ์ค๊ณ์๊ฐ ์ด ๊ธ์ ๋ณด๊ณ ์๋ค๋ฉด ๊ผญ ํฌํจํ์ธ์. ํ์ง๋ง ์ฝ๋ฃจํด์ ๋งค์ฐ ๊ฐ๋ฒผ์์ผ ํ๋ฉฐ, ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ํ์ ํ๊ธฐ ๋งค์ฐ ์ด๋ ต๊ฒ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ๋จ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฃจ์[18]๋ ์ฝ๋ฃจํด์ ์ ๊ณตํ์ง๋ง, ๊ทธ๊ฒ์ผ๋ก ๋ญ๊ฐ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ ํ์ํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ฒฐ๊ตญ ์์ ๋ง์ ์ค์ผ์ค๋ฌ, ์์ ๋ง์ ์ค๋ ๋ฉ ์์คํ ๋ฑ์ ๋ง๋ค๊ฒ ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ์ํ๋ ๊ฒ์ ์ฒ์์ ์์ํ๋ ๊ฒ์ ๋๋ค: ์ข์ ์ ์ค๋ ๋์ ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ์์ด๋ฌ๋๋ ์ ๊ฐ ์๊ฐํ๊ธฐ์ ์ด๊ฒ์ ์ ๋๋ก ๊ตฌํํ ์ธ์ด๊ฐ ํ๋ ์๋ฐ๋ผ๋ ์ ์ ๋๋ค. ์๋ฐ์ Project Loom์ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋ฃจํด๊ณผ ๋ชจ๋ ๋ฉ์ง ๊ธฐ๋ฅ๋ค์ ๊ฐ์ง๊ณ ์์ง๋ง, ๊ฐ๋ฐ์์๊ฒ๋ ์ข์ ์ ์ค๋ ๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ์บ๋ฆฌ์ด OS ์ค๋ ๋์ ๋ง์ดํธ๋๋ ๊ฐ์ ์ค๋ ๋๊ฐ ์๊ณ , ์ด ๊ฐ์ ์ค๋ ๋๋ ์ค๋ ๋ ๊ฐ์ ์ด๋ํ ์ ์์ต๋๋ค. ๊ฐ์ ์ค๋ ๋์์ ๋ธ๋กํน ํธ์ถ์ ํ๋ฉด ์ค์ผ์ค๋ฌ์ ์๋ณดํฉ๋๋ค.
์ด์ ์ ๋ ์ค๋ ๋๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ ๋์๋ ๋๊ธฐํ๊ฐ ํ์ํ๊ณ , ํต์ ๊ธฐ๋ณธ ์์ ๋ฑ์ด ํ์ํฉ๋๋ค. ์คํฌ๋์น์๋ ๋ฉ์์ง ์ ๋ฌ์ด ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ๋ค์ด ์ ์๋ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ ๋ง์ ๊ฒ์ด ํ์ํฉ๋๋ค.
์ค๋ ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๊ฒ ๋ง๋๋ ๋ฐ ํ์ํ ๊ฒ์ ๋ํด ๋ค๋ฅธ ๋ธ๋ก๊ทธ ํฌ์คํธ์์ ํ์ ์ค๋ช ์ ํ๊ณ ์ถ์ต๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ๊ฐ ๋ถ๋ช ํ ํ์ ํ ๊ฒ์ ์ด๋ฌํ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ์ธ์ด ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น๊ฒ ๊ฐ์ ธ์๋ค๋ ๊ฒ์ด๊ณ , ์ข ์ข ํ๋์ ๋น๋๊ธฐ/๋๊ธฐ ์ฝ๋๊ฐ ์ ํต์ ์ธ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ณด๋ค ์ฝ๊ธฐ ์ฌ์ ๋ณด์ ๋๋ค.
๊ตฌ์กฐํ๋ ๋์์ฑ๊ณผ ์ฑ๋*
๋ง์ง๋ง์ผ๋ก async/await์ ์ฅ์ ๊ณผ ๊ทธ๊ฒ์ด ๊ฐ์ ธ์จ ํ์ ์ ๊ดํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ์ด ์ธ์ด ๊ธฐ๋ฅ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋๋ฆฌ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ฆ์ผ๋ก์จ, ํผ์์๋ ์ค์ํ ํ์ ์ ์ด๋์ด๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ํ์ด์ฌ๊ฐ์ ์ธ์ด์์๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๊ธฐ๋ณธ์ ์ธ โ์์ฒญ๋น ๋จ์ผ ์ค๋ ๋โ ๋ชจ๋ธ์์ ๋ฒ์ด๋ ์์ ์ ๋ ์์ ๋จ์๋ก ๋๋๊ฒ ๋์์ฃ . ์ ๊ฒ ๊ฐ์ฅ ํฐ ํ์ ์ Trio[19]๊ฐ nursery[20]๋ฅผ ํตํด ๋์ ํ ๊ตฌ์กฐ์ ๋์์ฑ ๊ฐ๋ ์ ๋๋ค. ์ด ๊ฐ๋ ์ ๊ฒฐ๊ตญ asyncio์ TaskGroup API๋ฅผ ํตํด ์๋ฆฌ๋ฅผ ์ก์๊ณ , ์๋ฐ์๋ ๋์ ๋๊ณ ์์ต๋๋ค.
๊ตฌ์กฐ์ ๋์์ฑ์ ๋ํ ๋ ์์ธํ ์ค๋ช ์ ๋๋ค๋์ ์ค๋ฏธ์ค(Nathaniel J. Smith)์ โNotes on structured concurrency, or: Go statement considered harmfulโ๋ฅผ ์ฝ์ด๋ณด๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ํ์ง๋ง ์ด์ ๋ํด ์์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด, ์ ๊ฐ ๊ฐ๋จํ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- ์์ ์ ์์๊ณผ ๋์ด ๋ช ํํฉ๋๋ค: ๋ชจ๋ ์ค๋ ๋๋ ํ์คํฌ๋ ๋ช ํํ ์์๊ณผ ๋์ด ์์ด์, ๊ฐ ์ค๋ ๋๊ฐ ๋ฌด์์ ํ๋์ง ํ์ ํ๊ธฐ ์ฝ์ต๋๋ค. ์ค๋ ๋ ์ปจํ ์คํธ์์ ์์ฑ๋ ๋ชจ๋ ์ค๋ ๋๋ ํด๋น ์ค๋ ๋๊ฐ ์๊ณ ์์ฃ . ๋ง์น ์์ ์ ์ํด ์์ ํ์ ๋ง๋๋ ๊ฒ์ฒ๋ผ ์๊ฐํ์ธ์: ํจ๊ป ์์ํ๊ณ , ํจ๊ป ๋๋ด๊ณ , ๊ทธ๋ฆฌ๊ณ ๋ณด๊ณ ํฉ๋๋ค.
- ์ค๋ ๋๋ ๋ถ๋ชจ๋ณด๋ค ์ค๋ ์ด์ง ์์ต๋๋ค: ์ด๋ค ์ด์ ๋ก๋ ์์ ์ค๋ ๋๋ณด๋ค ๋ถ๋ชจ๊ฐ ๋จผ์ ๋๋๋ฉด, ์๋์ผ๋ก ๊ธฐ๋ค๋ฆฐ ํ์ ๋ฐํํฉ๋๋ค.
- ์๋ฌ๋ ์ ํ๋๊ณ ์ทจ์๋ฅผ ์ ๋ฐํฉ๋๋ค: ํ ์ค๋ ๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด, ์๋ฌ๊ฐ ๋ถ๋ชจ์๊ฒ ์ ๋ฌ๋ฉ๋๋ค. ๋ ์ค์ํ ๊ฒ์, ๋ค๋ฅธ ์์ ์ค๋ ๋๋ค๋ ์๋์ผ๋ก ์ทจ์๋๋ค๋ ์ ์ ๋๋ค. ์ทจ์๋ ์์คํ ์ ํต์ฌ์ ๋๋ค.
์ ๋ ๊ตฌ์กฐ์ ๋์์ฑ์ด ์ค๋ ๋ ์ธ๊ณ์์๋ ํ์๊ฐ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ค๋ ๋๋ ์์ ์ ๋ถ๋ชจ์ ์์์ ์์์ผ ํ๊ณ , ์ฑ๊ณต ๊ฐ์ ๋๋ ค์ฃผ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ๋ ์ฐพ์์ผ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ปจํ ์คํธ๋ ์ปจํ ์คํธ ๋ก์ปฌ์ ํตํด ์๋ฌต์ ์ผ๋ก ์ค๋ ๋ ๊ฐ์ ํ๋ฅผ ์ ์์ด์ผ ํฉ๋๋ค.
๋ ๋ฒ์งธ๋ก, ๋น๋๊ธฐ/๋๊ธฐ๋ ํ์คํฌ/์ค๋ ๋๊ฐ ์๋ก ๋ํํด์ผ ํ๋ค๋ ๊ฒ์ ๋์ฑ ๋ถ๋ช ํ๊ฒ ๋ง๋ค์์ต๋๋ค. ํนํ ์ฑ๋์ ๊ฐ๋ ๊ณผ ์ฑ๋ ์ ํ์ด ๋ ๋๋ฆฌ ํผ์ก์ฃ . ์ด๋ ํ์์ ์ธ ๊ตฌ์ฑ ์์์ด๋ฉฐ ๋ ๊ฐ์ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๊ฐํด ๋ณผ๋งํ ์ ์ ๊ตฌ์กฐ์ ๋์์ฑ์ด ์๋ค๋ฉด, ์์น์ ์ผ๋ก ๊ฐ ์ค๋ ๋์ ๋ฐํ ๊ฐ์ ์ค๋ ๋์ ์ฐ๊ฒฐ๋ ๋ฒํผ๋ ์ฑ๋๋ก ํํ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ต๋ ํ๋์ ๊ฐ(์ฑ๊ณตํ ๋ฐํ ๊ฐ ๋๋ ์๋ฌ)์ ๋ณด์ ํ๊ณ ์ ํํ ์ ์์ต๋๋ค.
์ค๋๋ ์ด๋ค ์ธ์ด๋ ์ด ๋ชจ๋ธ์ ์๋ฒฝํ๊ฒ ๊ตฌํํ์ง๋ ๋ชปํ์ง๋ง, ์๋ ๊ฐ์ ์คํ ๋๋ถ์ ๊ตฌ์กฐ์ ๋์์ฑ์ ํต์ฌ์ผ๋ก ํ๋ ํด๊ฒฐ์ฑ ์ด ๊ทธ ์ด๋ ๋๋ณด๋ค ๋ช ํํด ๋ณด์ ๋๋ค.

๊ฒฐ๋ก
์ด ๊ธ์ ํตํด ๋น๋๊ธฐ/๋๊ธฐ๊ฐ ์๋ ์ ๊ฒ์ด์๋ค๋ ์ ์ด ์ ์ค๋ช ๋๊ธธ ๋ฐ๋๋๋ค. ์ฝ๋ฐฑ ์ง์ฅ์์๋ ๋ฒ์ด๋ฌ์ง๋ง, ๋์ ์ปฌ๋ฌ ํจ์์ ๊ฐ์ ์๋ก์ด ๋ฌธ์ ๋ค, ๋ฐฑํ๋ ์ ๊ด๋ จ ๊ณผ์ ๋ค, ๊ทธ๋ฆฌ๊ณ ์์ํ resolve๋์ง ์๊ณ ๋จ์์์ ์ ์๋ ํ๋ก๋ฏธ์ค์ ๊ฐ์ ์ ํ ์๋ก์ด ๋ฌธ์ ๋ค์ ์๊ฒ ๋์์ฃ . ๋ํ ๋๋ฒ๊น ์ด๋ ํ๋กํ์ผ๋ง์ ํนํ ์ ์ฉํ๋ ์ฝ ์คํ์ ๋ง์ ์ด์ ๋ค๋ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์ฌ์ํ ๊ฒ์ด ์๋๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํด์ผ ํ ์ง๊ด์ ์ด๊ณ ๋ช ํํ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ก๋ง๋ ์ค์ ์ ์ธ ์ฅ์ ๋ฌผ๋ค์ด์ฃ .
ํ๋ฐ ๋ฌผ๋ฌ์์ ๋ณด๋ฉด, ์ค์ ์ค๋ ๋๋ฅผ ๊ฐ์ง ์ธ์ด๋ค์์ ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ๋์ ํ ๊ฒ์ ์๋ชป๋ ๋ฐฉํฅ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฐ์ Project Loom ๊ฐ์ ํ์ ์ด ์ฌ๊ธฐ์ ๋ ์ ํฉํด ๋ณด์ด๋ค์. ๊ฐ์ ์ค๋ ๋๋ ํ์ํ ๋ ์๋ณดํ ์ ์๊ณ , ๋ธ๋กํน๋ ๋ ์ปจํ ์คํธ๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ, ๋์์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ๋ง๋๋ ๋ฉ์์ง ์ ๋ฌ ์์คํ ๊ณผ๋ ์ ์๋ํฉ๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ํ๋ก๋ฏธ์ค ์์คํ ์ด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ ์๊ฐ์์ ๋ฒ์ด๋๋ค๋ฉด, ์ค๋ ๋๋ฅผ ๋ค์ ์ ๋๋ก ๋ณผ ์ ์์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ๋์์ ๋น๋๊ธฐ/๋๊ธฐ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ ๋ฉด์ ๋ด์ธ์ ๊ณ , ์ค์ ๋ก ํ์ ์ ์ด๋์ด๋์ต๋๋ค. ๋ฌธ๋ฒ์ ์ผ๋ก๋ ๋์์ฑ์ ์ธ์ด์ ํต์ฌ ๊ธฐ๋ฅ์ผ๋ก ๋ง๋ ๊ฒ์ ์ข์ ๋ณํ์์ฃ . ์๋ง๋ ์ด๋ ๊ฒ ๋๋ฆฌ ํผ์ง ์ฌ์ฉ๋ฒ๊ณผ ์ฌ๋๋ค์ ๊ณ ๋ฏผ์ด ํ์ด์ฌ์ ๋น๋๊ธฐ/๋๊ธฐ ์ธ๊ณ์์, ๊ตฌ์กฐ์ ๋์์ฑ์ด๋ผ๋ ์ค์ ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋ง๋ค์ด๋ด๊ฒ ํ์ ๊ฒ๋๋ค.
์์ผ๋ก์ ์ธ์ด ์ค๊ณ๋ ๋์์ฑ์ ๋ค์ ํ๋ฒ ๊ณ ๋ฏผํด์ผ ํฉ๋๋ค. ๋น๋๊ธฐ/๋๊ธฐ๋ฅผ ๋์ ํ๋ ๋์ , ์๋ก์ด ์ธ์ด๋ค์ ๋ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ธฐ๋ณธ ์์์ ํจ๊ป ์๋ฐ์ โProject Loomโ ๊ฐ์ ๋ชจ๋ธ์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํฌ๋์น์ฒ๋ผ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ๋์์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ ์ข์ API๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์กํฐ ํ๋ ์์ํฌ๊ฐ ์ ๋ต์ ์๋๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ตฌ์กฐ์ ๋์์ฑ, ์ฑ๋, ๊ทธ๋ฆฌ๊ณ ์์ฑ/์กฐ์ธ/์ ํ์ ์ํ ๋ฌธ๋ฒ์ ์ง์์ ์กฐํฉ์ด ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์๋ฌธ
๋ฐฑํ๋ ์ : ์ํํธ์จ์ด์์ ๋ฐ์ดํฐ์ ํ๋ฆ์ด ์ํ๋ ๋๋ก ์งํ๋์ง ๋ชปํ๊ณ ์ ํญ์ ๋ฐ๋ ์ํฉ โฉ๏ธ
์คํฌ๋์น (Scratch): ์์ด๋ค์ ๋์์ผ๋ก ๋ง๋ ๊ต์ก์ฉ, ๋ธ๋กํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด โฉ๏ธ
์กํฐ (Actor Framework): ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ชจ๋ธ โฉ๏ธ
๋ชจ๋๋ (monad): ๊ฐ์ ์์ ํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ํฌ์ฅํ๊ณ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์ โฉ๏ธ
๋๋ค (lambda): ์์ ํจ์ โฉ๏ธ
ํ๋ก๋ฏธ์ค (Promise): ๋ฏธ๋์ ๋ฐ๊ฒ ๋ ๊ฐ์ ๋ํ๋ด๋ ๊ฐ์ฒด โฉ๏ธ
์ปฌ๋ฌ ํจ์ (Colored functions): ํจ์์ ํน์ ์์ฑ์ด๋ ํจ๊ณผ๊ฐ ์์ด ์ด๋ฅผ ํธ์ถํ๋ ํจ์์๋ ๋์ผํ ์์ฑ์ ์๊ตฌํ๋ ํจ์๋ค์ ์ง์นญํ๋ ์ฉ์ด โฉ๏ธ
๊ฐ๋น์ง ์ปฌ๋ ์ : ํ๋ก๊ทธ๋จ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ โฉ๏ธ
์ ์ง ๋ฌธ์ (halting problem): ํ๋ก๊ทธ๋จ์ด ์ ํํ ์๊ฐ ๋ด์ ์ข ๋ฃ๋ ์ง ๋๋ ๋ฌดํํ ์คํ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฌธ์ โฉ๏ธ
๋ฒํผ ๋ธ๋กํธ(Buffer Bloat): ์์คํ ์ ๋ฒํผ๊ฐ ๊ณผ๋ํ๊ฒ ์ฐจ๋ ํ์ โฉ๏ธ
๋ธ๋กํน: ํ๋ก๊ทธ๋๋ฐ์์ ํน์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ฉ์ถ๊ณ ๊ธฐ๋ค๋ฆฌ๋ ์ํ โฉ๏ธ
์ผํธ๋ฆฌ (Sentry): ์ํํธ์จ์ด ์๋ฌ ๋ชจ๋ํฐ๋ง ๋ฐ ์ฑ๋ฅ ์ถ์ ํ๋ซํผ โฉ๏ธ
ํ์ด๋ฒ (Fiber): ๊ฒฝ๋ ์ค๋ ๋ โฉ๏ธ
์ฝ๋ฃจํด (Coroutine): ์ค๋จ/์ฌ๊ฐ๊ฐ ๊ฐ๋ฅํ ํจ์ โฉ๏ธ
GIL: ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ ์ ๊ธ์ฅ์น โฉ๏ธ
์คํ๋ ์ค (Stackless): ํ์ด์ฌ์ ์คํ ์ฒ๋ฆฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ ๊ตฌํ์ฒด โฉ๏ธ
task: .NET์์ ๋น๋๊ธฐ ์์ ์ ๋ํ๋ด๋ ๊ฐ์ฒด โฉ๏ธ
๋ฃจ์(Lua): ๊ฒฝ๋์ ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด โฉ๏ธ
Trio: ํ์ด์ฌ์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ โฉ๏ธ
Nursery: Trio์์ ์ ๊ณตํ๋ ๊ตฌ์กฐ์ ๋์์ฑ ํจํด์ ํต์ฌ ๊ฐ๋ โฉ๏ธ