Home [Go] Golang에서 sleep 하는 방법
Post
Cancel

[Go] Golang에서 sleep 하는 방법

[Go] Golang에서 sleep 하는 방법


Go 언어에서 프로그램 실행을 일시 중지하거나 지연시키고 싶을 때 time 패키지의 Sleep 함수를 사용할 수 있습니다. 이번 포스트에서는 Go에서 sleep을 사용하는 다양한 방법을 알아보겠습니다.

기본 사용법

Go에서 sleep을 사용하려면 time 패키지를 import하고 time.Sleep() 함수를 호출하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("시작")
    time.Sleep(2 * time.Second)
    fmt.Println("2초 후")
}

time.Sleep()time.Duration 타입을 인자로 받습니다. 위 예제에서는 2 * time.Second로 2초 동안 대기합니다.

다양한 시간 단위

Go의 time 패키지는 다양한 시간 단위를 제공합니다:

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
package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("시작")
    
    // 밀리초 단위
    time.Sleep(500 * time.Millisecond)
    fmt.Println("500밀리초 후")
    
    // 초 단위
    time.Sleep(2 * time.Second)
    fmt.Println("2초 후")
    
    // 분 단위
    time.Sleep(1 * time.Minute)
    fmt.Println("1분 후")
    
    // 시간 단위
    time.Sleep(1 * time.Hour)
    fmt.Println("1시간 후")
}

사용 가능한 시간 단위

단위설명
time.Nanosecond나노초 (1ns)
time.Microsecond마이크로초 (1µs)
time.Millisecond밀리초 (1ms)
time.Second초 (1s)
time.Minute분 (1m)
time.Hour시간 (1h)

실제 사용 예제

1. 반복 작업 사이에 대기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
    "fmt"
    "time"
)

func main() {
    for i := 1; i <= 5; i++ {
        fmt.Printf("작업 %d 실행 중...\n", i)
        time.Sleep(1 * time.Second)
    }
    fmt.Println("모든 작업 완료")
}

2. API 호출 간 지연

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
    "fmt"
    "time"
)

func callAPI() {
    fmt.Println("API 호출 중...")
    // API 호출 로직
}

func main() {
    for i := 0; i < 3; i++ {
        callAPI()
        // API 호출 간 2초 대기 (Rate limiting)
        time.Sleep(2 * time.Second)
    }
}

3. 고루틴과 함께 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
    "fmt"
    "time"
)

func worker(id int) {
    for i := 0; i < 3; i++ {
        fmt.Printf("Worker %d: 작업 %d\n", id, i)
        time.Sleep(1 * time.Second)
    }
}

func main() {
    // 여러 고루틴 실행
    go worker(1)
    go worker(2)
    
    // 메인 고루틴이 종료되지 않도록 대기
    time.Sleep(5 * time.Second)
    fmt.Println("모든 작업 완료")
}

주의사항

  • time.Sleep()은 현재 고루틴을 블로킹합니다. 다른 고루틴은 계속 실행됩니다.
  • 정확한 시간을 보장하지 않습니다. 시스템 스케줄러에 따라 실제 대기 시간이 약간 다를 수 있습니다.
  • 매우 짧은 시간(나노초 단위)의 sleep은 정확도가 떨어질 수 있습니다.

time.After()와의 차이

time.Sleep()은 지정된 시간 동안 블로킹하지만, time.After()는 채널을 반환하여 비동기적으로 사용할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("시작")
    
    // time.Sleep() - 블로킹
    time.Sleep(2 * time.Second)
    fmt.Println("2초 후 (Sleep)")
    
    // time.After() - 비블로킹 (채널 사용)
    <-time.After(2 * time.Second)
    fmt.Println("2초 후 (After)")
}

이 글이 Go에서 sleep을 사용하는 방법을 이해하는 데 도움이 되길 바랍니다!

This post is licensed under CC BY 4.0 by the author.