๐ Goroutine ๊ณ ๋ฃจํด
: Go ์ธ์ด์์ ์ ๊ณตํ๋ ๊ฒฝ๋ ์ค๋ ๋ (OS์ ์ํด ๊ด๋ฆฌ๋์ง ์๊ณ , Go ๋ฐํ์์ด ๊ด๋ฆฌํ๋ User-level ์ค๋ ๋)
`go func() {}`
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฉ์ธ์ง๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ
- ์์ฒ ๊ฐ์ ๊ณ ๋ฃจํด์ ์คํํด๋ ํจ์จ์
- Go ๋ฐํ์์ด ๊ณ ๋ฃจํด์ ์๋ ๊ด๋ฆฌ
Goroutine์ ๋์์ฑ(Concurrency)๊ณผ ๋ณ๋ ฌ์ฑ(Parallelism)์ ํจ์จ์ ์ผ๋ก ๊ตฌํํฉ๋๋ค.
๊ณ ๋ฃจํด์ ๋์์ฑ ์ ๋ฌด ์ฐจ์ด๋ ์ด ์์(Go Concurrency Explained: Go Routines & Channels)์ ํตํด ์ฝ๊ฒ ์ดํดํด๋ณผ ์ ์์ต๋๋ค.
*๋์์ฑ: ์ฌ๋ฌ ์์ ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ํจ์จ์ ์คํ
*๋ณ๋ ฌ์ฑ: ์ฌ๋ฌ ์์ ์ ์ค์ ๋ก ๋์์ ์คํ
โถ๏ธ Channel ์ฑ๋
: Goroutine๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ํ์ดํ๋ผ์ธ
`chan` `<-`
- ๊ณ ๋ฃจํด ๊ฐ์ ํต์
- ํน์ ๋ฐ์ดํฐ ํ์ ๋ง ์ ์ก ๊ฐ๋ฅ
- ๊ณ ๋ฃจํด ๊ฐ์ ๋๊ธฐํ ์๋ ์ฒ๋ฆฌ
Channel์ ๊ณ ๋ฃจํด์ด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์กด์ฌํฉ๋๋ค.
producer-consumer ๊ตฌ์กฐ๋ก ์ฑ๋์ ์ด๋ค ์ฌ์ด์์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐ ๋๊ธฐํ ์ญํ ์ ํฉ๋๋ค.
โธ๏ธ WaitGroup
: ๊ณ ๋ฃจํด๋ค์ ์์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ตฌ
`Add()` : ๋๊ธฐํ ๊ณ ๋ฃจํด ์ ๋ฑ๋ก
`Done()` : ๊ณ ๋ฃจํด ์์ ์๋ฃ ์๋ฆฌ๊ธฐ
`Wait()` : ๋ชจ๋ ๊ณ ๋ฃจํด์ด ๋๋ ๋๊น์ง ๋๊ธฐํ๊ธฐ
๊ณ ๋ฃจํด์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์, ๋ฉ์ธ ํ๋ก๊ทธ๋จ์ด ๋จผ์ ์ข ๋ฃ๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ณ ๋ฃจํด์ด ๊ฐ์ ์ข ๋ฃ๋ฉ๋๋ค.
์ด ๋๋ฌธ์ WaitGroup์ ์ฌ์ฉํฉ๋๋ค. ๋ํ, ์ฌ๋ฌ ๊ณ ๋ฃจํด๋ค์ ๊ด๋ฆฌํ ์๋ ์์ต๋๋ค.