고루틴

주의반복문에서 고루틴을 돌리면 신기하게 결과물이 나올 때가 있습니다.아래 코드를 실행했을 때의 결과는 무엇일까요?import ( "fmt" "sync")func main() { var wg sync.WaitGroup for _, text := range []string{"a", "b", "c"} { wg.Add(1) go func() { defer wg.Done() fmt.Println(text) }() } wg.Wait()} 만약 a, b, c가 랜덤으로 출력 것이라 생각하신다면 틀렸습니다결과는 아래와 같습니다.ccc 왜 이런 일이이유는 루프문이 고루틴보다 먼저 끝나서 고루틴에서 사용할 수 있도록 메모리를 힙으로 옮겼기 때문입니다.즉 for문이 먼저 끝나서 text의 값은 마지막 c를 가리..
Go  스케줄링고루틴 : Go의 최소 실행 단위로, main도 profile도 모든 게 다 고루틴고의 동시성에서는 Go 스케줄러로 어떻게 효율적으로 관리하느냐에 크게 의존합니다. goroutine 생성새로운 작업(Goroutine, G)이 생성되면, 해당 작업은 현재 P(processor)의 LRQ에 삽입됩니다.P는 자신만의 LRQ(Local Run Queue)를 보유하며 P의 개수는 GOMAXPROCS로 결정됩니다.이거로 동시 실행이 가능한 goroutine 수를 제한합니다.로컬 처리P는 자신의 LRQ에 있는 작업을 우선 실행하는 데 이 과정은 빠르고 효율적이며, 락 경합 없이 처리됩니다.글로벌 작업 분배만약 한 P의 LRQ가 비거나 작업이 부족하면, 해당 P는 다른 P의 LRQ에서 작업을 훔치거나 G..
개요이번 포스팅은 Golang을 할 때 가장 큰 장점으로 꼽히는 부분인 동시성(고루틴)과 크게 관련된 내용입니다.동시성 프로그래밍은 사실 쉽지 않습니다.  동시에 실행된다는 개념 때문에 프로그래머가 생각하는 순서와 실제 프로세스의 순서가 다를 수 있습니다.이 문제를 레이스 컨디션이라 부릅니다.레이스 컨디션 (Race Condition) : 개발자의 의도와 상관없이 프로세스의 순서가 바뀌어 결과가 일정하지 않은 문제 아래는 간단한 레이스 컨디션의 예제입니다.var num intgo func() { num++}()if num == 0 { fmt.Printf("The value is %d.\n", num)} 위 코드의 결과는 대부분 "The value is 0."로 출력될 겁니다.요즘 사용하는 컴퓨터의 수준은..
DSeung
'고루틴' 태그의 글 목록