Skip to content

Latest commit

Β 

History

History
96 lines (60 loc) Β· 2.95 KB

README.md

File metadata and controls

96 lines (60 loc) Β· 2.95 KB

safego

Go Static Badge

img.png


πŸ“Œ μ™œ λ§Œλ“€μ—ˆλŠ”κ°€ ?

Goμ—μ„œ 고루틴 λ‚΄μ—μ„œ panic이 λ°œμƒν•˜λ©΄, 이 panic은 고루틴을 μƒμ„±ν•œ λΆ€λͺ¨ ν•¨μˆ˜λ‘œ μ „νŒŒλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λΆ€λͺ¨ ν•¨μˆ˜μ— recover 둜직이 μ‘΄μž¬ν•΄λ„ 고루틴 λ‚΄μ—μ„œ λ°œμƒν•œ panic을 μž‘μ§€ λͺ»ν•˜κ³  ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ ν˜„μƒμ΄ λ°œμƒν•˜λŠ” μ΄μœ λŠ” 고루틴 λ‚΄μ—μ„œ panic이 λ°œμƒν•  경우, panicking μƒνƒœκ°€ λΆ€λͺ¨ 고루틴에 μ „νŒŒλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


각 κ³ λ£¨ν‹΄λ§ˆλ‹€ panic을 κ°œλ³„μ μœΌλ‘œ μ²˜λ¦¬ν•˜κ³  적절히 λ³΅κ΅¬ν•˜λ©΄ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, κ³ λ£¨ν‹΄λ§ˆλ‹€ recover λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 것은 λ²ˆκ±°λ‘­μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ safego νŒ¨ν‚€μ§€λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

safego νŒ¨ν‚€μ§€λŠ” 고루틴 λ‚΄μ—μ„œ λ°œμƒν•œ panic을 λΆ€λͺ¨ ν•¨μˆ˜λ‘œ μ•ˆμ „ν•˜κ²Œ 전달할 수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.



βš™ 핡심 λ™μž‘ 원리

μ•„λž˜ λ‹€μ΄μ–΄κ·Έλž¨μ€ safego.WaitGroup의 핡심 λ™μž‘ 원리λ₯Ό μ‹œκ°μ μœΌλ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€.

  • safego νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ panic λ°œμƒ μ‹œ WaitGroup과의 연동 문제λ₯Ό μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • wg.Done() 호좜 전후에 λ°œμƒν•˜λŠ” panic 상황 λͺ¨λ‘μ—μ„œ 고루틴이 μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λ„λ‘ 보μž₯ν•©λ‹ˆλ‹€.

  • λͺ¨λ“  고루틴이 μ’…λ£Œλ  λ•ŒκΉŒμ§€ 기닀리고, λ°œμƒν•œ panic을 ν•œ λ²ˆμ— μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

case image



πŸš€ safego μ‚¬μš©λ²•

  • SafeGo λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ 고루틴을 μ‹œμž‘ν•˜κ³ , 고루틴 λ‚΄μ—μ„œ panic이 λ°œμƒν•˜λ©΄ 이λ₯Ό 채널을 톡해 μˆ˜μ§‘ν•©λ‹ˆλ‹€.
  • Wait λ©”μ„œλ“œλŠ” λͺ¨λ“  고루틴이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜κ³ , 채널을 톡해 μˆ˜μ§‘λœ λͺ¨λ“  panic을 λ‹€μ‹œ panic으둜 λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” panic λ°œμƒ 여뢀에 따라 Wait λ©”μ„œλ“œμ˜ λ™μž‘μ„ κ²€μ¦ν•©λ‹ˆλ‹€.

package safego

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestWaitGroup_NoError_Case(t *testing.T) {
	// Given
	as := assert.New(t)
	var wg WaitGroup

	// When
	wg.SafeGo(func() {
		// μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜, νŒ¨λ‹‰ μ—†μŒ
	})

	// Then
	as.NotPanics(wg.Wait)
}

func TestWaitGroup_WithPanic_Case(t *testing.T) {
	// Given
	as := assert.New(t)
	var wg WaitGroup

	// When
	wg.SafeGo(func() {
		panic("test panic") // μ—¬κΈ°μ„œ νŒ¨λ‹‰ λ°œμƒ
	})

	// Then
	as.Panics(wg.Wait) // Wait 호좜 μ‹œ νŒ¨λ‹‰μ΄ λ°œμƒν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ
}



β€Ό μ£Όμ˜μ‚¬ν•­

  • Done λ©”μ„œλ“œ 직접 호좜 κΈˆμ§€, SafeGoλ₯Ό μ‚¬μš©ν•˜λŠ” 고루틴 λ‚΄μ—μ„œλŠ” wg.Done()을 직접 ν˜ΈμΆœν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”.
  • SafeGoκ°€ 이λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ— 쀑볡 호좜 μ‹œ WaitGroup μΉ΄μš΄ν„°κ°€ 잘λͺ» 관리될 수 μžˆμŠ΅λ‹ˆλ‹€.