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]
}
- 고루틴으로 실행할 함수입니다.
done
채널을 이용해서 다른 고루틴에서 현재 함수가 사용중인지를
검사하는 채널로 사용하고 있습니다. - 현재 함수가 처리를 완료하면
done
채널에true
값을 전송합니다. (불타입 채널) - 작업용 고루틴이 시작되면 채널에 사용중을 의미하는
true
값이 들어있게 됩니다. - 채널에서 작업용 고루틴으로 부터 신호가 올때까지 대기하게 됩니다.
실행하면 다음과 같습니다.
$ go run channel-synchronization.go
working...done
만약 상기의 코드에서 <- done
코드를 제거하게되면, 프로그램은 worker()
함수를 수행하기 전에,
곧바로 종료하게 됩니다.