errgroup in golang
errgroup
go๋ฅผ ์ฐ๋ค๋ณด๋ฉด ๋ฐ๋์ ๊ฑฐ์น๊ฒ ๋๋ ๋ฃจํธ๊ฐ ๋ฐ๋ก concurrent programming์ด๋ค.
์ฐ๋ฆฌ๋ ๊ณ ๋ฃจํด์ ์ ์ดํ๊ธฐ ์ํด์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐ๋๋ฐ, ์ค๋์ errgroup์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
์ฐ์ ์ผ๋ฐ์ ์ผ๋ก WaitGroup์ ์ด์ฉํด์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ๋ณด์.
package main
import "sync"
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
// do something ...
}()
wg.Wait()
}๋จ์ํ wg์ ์์ ์ ํ๋ ์ถ๊ฐํ๊ณ , ์์ ์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ง๋ฌด๋ฆฌํ๋ ์ฝ๋์ด๋ค.
๊ทธ๋ฌ๋ WaitGroup์ ์ฐ๋ค๋ณด๋ฉด ๊ฐ๋ ์ฌ๋ฌ ๋ฌธ์ ์ ๋ถ๋ชํ ๋๊ฐ ์์์ ๊ฒ์ด๋ค.
WaitGroup์ ๊ฐ์ด 0์ด ๋๋๋ก ์ปจํธ๋กค์ ํ๋๋ฐ์ ์คํจํ๋ค๊ฑฐ๋, ์์๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค๊ฑฐ๋ ๋ฑ๋ฑโฆ
์ฌ์ค ๋์์ฑ์ ์ ๋๋ก ์ ์ดํ๋ค๋ฉด ์ผ์ด๋์ง ์์ ์ผ์ด์ง๋ง, ์ข ์ข ์ผ์ด๋๋ ์ผ์ด๊ธด ํ๋ค.
goroutine with errgroup
errgroup์ golang.org/x/sync ํจํค์ง์ ํฌํจ๋์ด ์๋ 4๊ฐ์ง์ ๊ตฌํ ์ค ํ๋์ด๋ค.
semaphore: weight๊ฐ ์๋ ์ธ๋งํฌ์ด.singleflight- ์ค๋ณต function call suppression์ ์ง์.syncmap- map type์ ๋์์ ์ผ๋ก ์ฌ๋ฌ goroutine ๋ด์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.errgroup- ํ๋์ ๊ณตํต์ ์ธ ์์ ์ subtask๋ค์ ์คํํ๋ goroutine๋ค์ context cancellation, synchronization, ๊ทธ๋ฆฌ๊ณ error propagation์ ์ง์ํ๋ค.
ํ ๋ฒ ์์ ๋ฅผ ๋ณด์.
errgroup์ WithContext ํจ์๋ ์ปจํ
์คํธ ๊ทธ๋ฃน๊ณผ, ์ปจํ
์คํธ๋ฅผ ๋ฐํํ๋ค.
errgroup์ ํนํ ์งํํ๋ ์์
๋ค์ด ์๋ฌ๋ฅผ ์ผ๊ธฐํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๋ ์ฌ์ฉํ๊ธฐ ์ ์ฉํ๋ค.
errgroup์ WithContext์ ๊ธฐ์กด์ context๋ฅผ ์ ๋ฌํ๋ฉด Group type๊ณผ ctx๋ฅผ ๋ฆฌํดํ๋ค. ๋ฆฌํด๋ Group type์ผ๋ก goroutine์ ์์ํ ์ ์๋ค.
๊ธฐ์กด์ go ... ๋ก goroutine์ ์์ํ๋ ๋ถ๋ถ์ g.Go(func() ...) ๋ก ๋์ฒดํ ์ ์๋ค. errgroup์ goroutine์ ์คํ์ํค๊ณ ํด๋น goroutine ์์
์์ ์๋ฌ๊ฐ ๋ฐ์ ๋๋์ง ์ง์ผ๋ณธ๋ค.
errgroup์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค:
errgroup์ ์ฌ์ฉํ๋ฉดWaitGroup์ ์ฌ์ฉํ์ ๋ ์ฒ๋ผAdd๋Done์ ์ฌ์ฉํด์ goroutine๋ค์ ์๋ฅผ ์ง์ ์กฐ์ ํ ํ์๊ฐ ์๋ค.goroutine๋ค์ด ์๋ฃ๋ ๋๊น์ง
errgroup์ด ์์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ค ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง๋if err:= g.Wait();์ ํตํด ๋ฐ๋ก ๋ฐ์ ๋ณผ ์ ์๋ค.
Last updated