저작권 안내
- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
동기화 객체 사용하기
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
함수를 한 번만 실행하기
Once를 사용하면 함수를 한 번만 실행할 수 있습니다. 다음은 고루틴 안에서 Hello, world!를 출력합니다.
sync 패키지에서 제공하는 Once의 구조체와 함수는 다음과 같습니다.
- sync.Once
- func (*Once) Do(f func()): 함수를 한 번만 실행
package main
import (
"fmt"
"runtime"
"sync"
)
func hello() {
fmt.Println("Hello, world!")
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용
once := new(sync.Once) // Once 생성
for i := 0; i < 3; i++ {
go func(n int) { // 고루틴 3개 생성
fmt.Println("goroutine : ", n)
once.Do(hello) // 고루틴은 3개지만 hello 함수를 한 번만 실행
}(i)
}
fmt.Scanln()
}
Once는 sync.Once를 할당한 뒤에 Do 함수로 사용합니다. Do 함수에는 실행할 함수 이름을 지정하거나, 클로저 형태로 함수를 지정할 수 있습니다. Once는 어떤 상황이든 상관없이 지정된 함수를 딱 한 번만 실행시킵니다.
여기서는 고루틴을 3개 실행시키고 각각 Once의 Do 함수로 hello 함수를 실행시켰지만 실제로는 한 번만 실행되었습니다.
goroutine : 1
Hello, world!
goroutine : 0
goroutine : 2
이처럼 Once는 한 번만 실행되는 특성이 있으므로 복잡한 반복문 안에서 각종 초기화를 할 때 유용합니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.