[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을 사용하는 방법을 이해하는 데 도움이 되길 바랍니다!