2021년에 작성한 노트를 옮겨 적은 것입니다.
C 90 % + javascript 10%의 느낌
알려진 것과 다르게 진입 장벽이 낮진 않음.
병렬 프로그래밍을 위한 언어이고, 그걸 잘 만들수 있도록 여러 라이브러리를 언어 레벨에서 구현하였으니
프로그래머가 알아서 똑똑하게 잘 써야함.
너가 병렬처리 못해서 프로그램이 돌릴 때마다 다른 결과 나와도 너의 탓이고 go가 뭘 말해주진 않음.
func main() {
ch := make(chan int)
go foo(ch)
go bar(ch)
}
func foo(ch chan int) {
...
ch <- 45 // 채널에 값 넣는다
}
func bar(ch chan int) {
...
v := <- ch // 값이 올 때까지 기다리다가 오면 처리함
println(v)
}
WaitGroup은 고루틴이 완료될 때까지 기다립니다. 메인 고루틴은 Add를 호출하여 몇 개의 고루틴을 기다릴 것인지 설정합니다. 각각의 고루틴은 작업이 완료되면 Done을 호출합니다. Wait는 모든 고루틴이 완료될 때까지 프로그램을 블락합니다.
package main
import (
"context"
"fmt"
"sync"
"time"
)
func longFunc() string {
<-time.After(time.Second * 5)
return "Success"
}
func longFuncWithCtx(ctx context.Context) (string, error) {
done := make(chan string)
go func() {
done <- longFunc()
}()
select {
case result := <-done:
return result, nil
case <-ctx.Done():
return "Fail", ctx.Err()
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go func() {
time.Sleep(2 * time.Second)
cancel()
}()
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1) // 기다릴 goroutine이 1개
go func() {
defer wg.Done()
result, err := longFuncWithCtx(ctx)
if err != nil {
fmt.Println(err)
}
fmt.Println(result)
}()
}
wg.Wait() // 모든 goroutine이 완료될 때까지 기다림
}