Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Archives
Today
Total
관리 메뉴

Code Habit

Go ) sync.Once 본문

카테고리 없음

Go ) sync.Once

코드베어 2020. 6. 11. 08:13

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