Go

Go : 고루틴(goroutine), 채널(channels)

mokhs 2022. 3. 20. 15:27

κ°œμš”

  • 고루틴(goroutine)κ³Ό 채널(channel)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž

 

고루틴(goroutine)

  • 고루틴은 GoλŸ°νƒ€μž„μ—μ„œ 비동기 처리λ₯Ό μ΄μš©ν•œ λ™μ‹œμ„±μ„ μ§€μ›ν•˜λŠ” κ²½λŸ‰ 가상 μ“°λ ˆλ“œμ΄λ‹€.
  • 가상 μ“°λ ˆλ“œλΌλŠ” 것은 μ‹€μ œλ‘œ OSλ ˆλ²¨μ—μ„œ μ“°λ ˆλ“œκ°€ μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(Go)λ ˆλ²¨μ—μ„œ κ°€μƒμ˜ μ“°λ ˆλ“œκ°€ μƒμ„±λ˜λŠ” 것을 μ˜λ―Έν•˜λ‹ˆ μ£Όμ˜ν•˜μž
  • λŸ°νƒ€μž„μ—μ„œλ§Œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— main λŸ°νƒ€μž„μ΄ μ’…λ£Œλ˜λ©΄ λͺ¨λ“  고루틴이 μ’…λ£Œλ˜λ‹ˆ μ£Όμ˜ν•˜μž
  • go ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ 고루틴을 μ„ μ–Έν•œλ‹€
  • λ‹€μŒ μ˜ˆμ‹œλ₯Ό ν†΅ν•΄μ„œ κ³ λ£¨ν‹΄μ˜ μ‚¬μš©λ²•μ„ μ•Œμ•„λ³΄μž
import (
  "fmt"
  "time"
)

func main() {
  // go ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ 고루틴 생성 -> λ™μ‹œμ— 싀행됨. 전체 좜λ ₯을 λ³΄λ©΄μ„œ μ΄ν•΄ν•΄λ³΄μž
  go bar("foo")
  bar("bar")

  /* 전체 좜λ ₯
  bar 0
  foo 0
  foo 1
  bar 1
  bar 2
  foo 2  
  */
}

func bar(name string) {
  for i := 0; i < 10; i++ {
    fmt.Println(name, i)
    time.Sleep(time.Second)
  }
}

channels

  • 고루틴 간에 channel을 μ΄μš©ν•΄ 데이터λ₯Ό μ£Όκ³  받을 수 μžˆλ‹€
  • chan νƒ€μž…μ„ μ΄μš©ν•˜λ©° 보톡 κ³ λ£¨ν‹΄μœΌλ‘œ μ‚¬μš©ν•  ν•¨μˆ˜μ— λ§€κ°œλ³€μˆ˜λ‘œ 채널을 μ „λ‹¬ν•˜λŠ” μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€
  • 채널에 데이터λ₯Ό 전달할 λ•ŒλŠ” channel <- true와 같은 ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•œλ‹€
  • channel에 μ „μ†‘λœ λ°μ΄ν„°λŠ” <-channel을 μ΄μš©ν•΄ 받을 수 μžˆλ‹€
  • λ‹€μŒ μ˜ˆμ‹œλ₯Ό 톡해 μ•Œμ•„λ³΄μž
  • *μ€‘μš” : main λŸ°νƒ€μž„μ΄ μ’…λ£Œ μ‹œμ— 고루틴이 λͺ¨λ‘ μ’…λ£Œλ˜λ―€λ‘œ 이 점을 항상 μ£Όμ˜ν•˜μž
func foo(person string, channel chan bool) {
  time.Sleep(time.Second * 3)
  fmt.Println(person)
  channel <- true
}

func main() {
  channel := make(chan bool)

  people := [2]string{"a", "b"}
  for _, person := range people {
    go foo(person, channel)
  }

  for range people {
    fmt.Println(<-channel)
  }
}
λ°˜μ‘ν˜•