2025.05.04 TIL
[ go ]

Go의 동시성

go의 동시성 모델은 CSP(Communicating Sequential Processes, 순차적 프로세스들의 통신)을 기반으로 함

주의 사항

고루틴

채널

읽기, 쓰기, 버퍼

a := <-ch // ch에서 값을 읽어 a에 할당
ch <- b // b의 값을 ch에 씀

더 알아보기

for-range

for v := rance ch {
  fmt.Println(v)
}

채널 닫기

select 문

select {
  case v := <-ch:
    fmt:Println(v)
  case v := <-ch2:
    fmt.Println(v)
  case ch3 <- x:
    fmt.Println("wrote", x)
  case <-ch4:
    fmt.Println("got value on ch4, but ignored it")
}

동시성 사례와 패턴

func main() {
  a := []int{2, 4, 6, 8, 10}
  ch := make(chan int, len(a))
  for _, v := range a {
    go func() {
      ch <- v * 2
    }()
  }
}
for_, v := range a {
  go func(val int) {
    ch <- val * 2
  }(v)
}

배압

select에서 case 문 해제

for {
  select {
    case v, ok := <-in:
      if !ok {
        in = nil // 해당 case는 더 이상 성공할 수 없다!
        continue
      }
      // in에서 읽은 값을 v로 처리한다.
    case v, ok := <-in2:
      if !ok {
        in2 = nill // 해당 case는 더 이상 성공 할 수 없다!
        continue
      }
      // in2에서 읽은 값을 v로 처리
    case <-done:
      return
  }
}

WaitGroup의 사용