Go by Example: [25] Channel Synchronization

Channel Synchronization

고루틴들 간에 동기화를 채널을 통해서 제어할 수 있습니다.
다음예제는 특정 고루틴이 작업을 완료할때까지 대기하는 방법에 대해서 설명합니다.

package main

import "fmt"
import "time"

func worker(done chan bool) {          // [1]
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")
    
    done <- true                       // [2]
}

func main() {
    
    done := make(chan bool, 1)         // [3]
    
    go worker(done)
    
    <-done                             // [4]
}
  1. 고루틴으로 실행할 함수입니다. done 채널을 이용해서 다른 고루틴에서 현재 함수가 사용중인지를
    검사하는 채널로 사용하고 있습니다.
  2. 현재 함수가 처리를 완료하면 done 채널에 true값을 전송합니다. (불타입 채널)
  3. 작업용 고루틴이 시작되면 채널에 사용중을 의미하는 true값이 들어있게 됩니다.
  4. 채널에서 작업용 고루틴으로 부터 신호가 올때까지 대기하게 됩니다.

실행하면 다음과 같습니다.

$ go run channel-synchronization.go      
working...done                  

만약 상기의 코드에서 <- done 코드를 제거하게되면, 프로그램은 worker()함수를 수행하기 전에,
곧바로 종료하게 됩니다.