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์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. errgroup์„ ์‚ฌ์šฉํ•˜๋ฉด WaitGroup์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ฒ˜๋Ÿผ Add ๋‚˜ Done์„ ์‚ฌ์šฉํ•ด์„œ goroutine๋“ค์˜ ์ˆ˜๋ฅผ ์ง์ ‘ ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  2. goroutine๋“ค์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ errgroup ์ด ์•Œ์•„์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋„ if err:= g.Wait();์„ ํ†ตํ•ด ๋ฐ”๋กœ ๋ฐ›์•„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Last updated