티스토리 뷰
회사에서 Go를 주 언어로 밀고 있고, 배정받은 팀에서도 Go로 개발을 진행하고 있기에 Go 언어를 학습하기 시작했다. 그러던 중 Goroutine을 마주치게 되었다.
Goroutine이란?
고루틴은 Go 언어의 동시성 프로그래밍을 가능하게 해주는 경량 스레드이다. 좀더 쉽게 풀어서 얘기하면, 가벼운 스레드라고 생각하면 된다.
Multi Thread와 Goroutine의 차이
멀티 스레드와 고루틴은 모두 '병행성(Concurrency)'을 위한 기술이지만, 몇가지 차이점이 존재한다.
첫째로, 스레드는 OS 수준에서 관리되며, 많은 자원을 사용하여 생성하고 관리된다. 반면 고루틴은 Go 언어 런타임에서 관리되기에 더 적은 메모리를 사용한다.
두 번째로, 스레드는 OS에서 스케줄링 되어 작업을 수행한다. 반면 고루틴은 Go 런타임에서 관리되며, 더 효율적으로 스케줄링 된다.
세 번째로, 스레드는 별도의 stack 메모리 공간을 가지기 때문에 스레드 간 데이터 공유 및 동기화 문제가 발생할 수 있다. 반면, 고루틴은 Go 런타임에서 스택을 동적으로 할당하고 공유하여, 문제를 해결한다.
마지막으로, 스레드는 작업이 완료될 때까지 기다려야 하지만, 고루틴은 비동기적으로 작업을 처리할 수 있기 때문에 더 높은 처리량과 응답성을 제공할 수 있다.
쉽게 말해, 고루틴은 스레드에 비해 더 적은 자원을 사용하기 때문에 더 효율적이고 빠르다.
간단한 Goroutine 예시
package main
import (
"fmt"
)
func f() {
var i int
for i = 0; i < 5; i++ {
fmt.Print(i, " ")
}
}
func main() {
go f()
f()
}
위의 코드는 간단한 고루틴 예시 코드이다.
고루틴을 만드는 것은 정말 간단한데, 함수 앞에 키워드 "go"만 붙이면 된다. 위의 코드의 실행 결과는 아래와 같다.
0 1 2 3 4
음? 기대했던 결과와 다르다. 분명 f() 함수를 두번 실행했는데 한번만 실행한 결과가 나온다. 이유는 간단하다.
위의 코드를 실행하면, main 함수에서 f() 함수를 호출한 후에, 고루틴으로도 f() 함수를 실행한다. 그러나, main() 함수는 실행중인 고루틴이 종료되는 것을 기다리지 않는다. 따라서 main() 함수가 종료되면서 고루틴도 함께 종료되게 되고 고루틴이 실행되지 않는다.
package main
import (
"fmt"
"time"
)
func f() {
var i int
for i = 0; i < 5; i++ {
time.Sleep(10 * time.Millisecond)
fmt.Print(i, " ")
}
}
func main() {
go f()
f()
}
그래서 위와같이 약간 기다리도록 sleep 코드를 추가라면 아래와 같이 고루틴이 성공적으로 호출된 결과를 볼 수 있다.
0 0 1 1 2 2 3 3 4 4
익명 Goroutine
Go 언어는 익명 함수를 지원한다. 그래서 고루틴을 아래와 같이 익명으로 지정할 수도 있다.
package main
import (
"fmt"
"time"
)
func PrintName(f string, l string) {
fmt.Println(f, l)
}
func main() {
var i int
go func() {
for i = 0; i < 7; i++ {
fmt.Print(i, " ")
time.Sleep(100 * time.Millisecond)
}
}()
time.Sleep(1 * time.Second)
PrintName("John", "Doe")
}
Ref :
'Language > Go' 카테고리의 다른 글
[Go] Soft Delete (12) | 2023.03.26 |
---|
- Total
- Today
- Yesterday
- Database
- spring
- OS
- paging
- go
- cs
- fiber
- 공지
- network
- java
- ARP
- soft delete
- mmu
- Effective Java
- effective
- Operating System
- algorithm
- GORM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |