Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- write
- 책
- go
- Close
- GO 언어
- windows
- http
- json
- range
- Linux
- Sync
- tcp
- install
- package
- c++
- bitcoin
- mutex
- Python
- FOR
- Callback
- Golang
- go언어
- 리뷰
- channel
- 영화
- JavaScript
- File
- window
- API
- C
Archives
- Today
- Total
Code Habit
Go ) sync.Once 본문
Once를 사용하면 함수를 한 번만 실행할 수 있다.
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는 어떤 상황이든 상관없이 지정된 함수를 딱 한번만 실행시킨다.
이처럼 Once는 한 번만 실행되는 특성이 있으므로 복잡한 반복문 안에서 각종 초기화를 할 때 유용하다.
실행결과
goroutine : 1
Hello, world!
goroutine : 0
goroutine : 2
|