go routine이란?
go runtime에 의해 관리되는 lightweight thread이다.
go routine은 비동기적으로 함수루틴을 실행하므로, 작업을 동시적으로 처리하기 위해 사용된다.
keyword로 살펴보기
go routine vs thread
"go runtime에 의해 관리되는 lightweight thread이다."
고루틴은 할당받는 자원을 이용하는 실행의 단위라는 관점에서
스레드와 본질적으로는 같은 것이다.
그러면 go routine과 thread의 차이는 무엇일까?
thread는 OS의 스케줄링에 따라 움직이기 때문에, 리소스 요청 등 전처리가 필요하고, 여기서 발생하는 비용이 크다.
반면 go routine은 OS에 리소스를 요청하지 않는다. go 스케줄러가 스케줄링을 하며, 런타임에서 처리되기 때문에 비용이 매우 저렴하다.
즉, OS 스케줄러는 고루틴을 모른다. 따라서 go는 go routine의 메뉴얼 관리를 지원하지 않는다.
동시성(vs 병렬성) - Concurrency(vs Parallelism)
"go routine은 작업을 동시적으로 처리하기 위해 사용된다."
동시적이란 작업을 동시에 처리하는 것을 말하는데, 병렬성과의 차이는 무엇일까?
동시성은 싱글 코어에서 작업을 시분할로 처리하여 동시에 실행되는 것처럼 보이게 하는 것이다.
논리적인 개념으로, 소프트웨어의 성질이다.
task1을 끝내고 task2를 끝내는 것이 아닌, task1을 일정량 처리하고 task2를 일정량 처리하는 방식으로 일을 진행한다.
병렬성은 멀티 CPU 코어에서 나눠서 작업을 동시에 처리한다.
물리적인 개념으로, 하드웨어의 성질이다.
task1, task2, task3이 실제로 한번에 처리된다.
예제
package main
import (
"fmt"
"time"
)
func say(s string){
for i:=0; i<3; i++{
time.Sleep(1 * time.Second)
fmt.Println(s, " - ", i)
}
}
func main() {
say("main1")
go say("go routine1")
go say("go routine2")
go say("go routine3")
say("main2")
say("main3")
time.Sleep(10 * time.Second)
}
위 예제는.
첫번째 say(main1)은 함수가 완전히 끝났을 때 다음 문장으로 이동한다.(동기적)
다음 3개의 go say() 호출은 별도의 go routine에서 동시에 동작하게 되고,(동시성)
main루틴은 계속 다음 문장(main2, main3, time.Sleep)을 실행한다.(동기적)
go routine들은 그 실행순서가 일정하지 않음을 확인할 수 있다.(비동기적)
즉,
main은 동기적으로 실행되고,
go routine은 비동기적으로, 동시성을 가지며 실행된다.
references
https://tour.golang.org/concurrency/1
A Tour of Go
tour.golang.org
http://golang.site/go/article/21-Go-%EB%A3%A8%ED%8B%B4-goroutine
예제로 배우는 Go 프로그래밍 - Go 루틴 (goroutine)
1. Go루틴 Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드(주1)이다. Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다. goroutine은
golang.site
https://darrengwon.tistory.com/1011
Go Routine (1) : concurrency를 위한 고루틴의 원리 및 간단한 활용 + 멀티 코어
Go Routine의 원리 참고 : stonzeteam.github.io/How-Goroutines-Work/ 참고 : tech.ssut.me/goroutine-vs-threads/ 동시성 처리하면 보통 멀티 스레드가 떠오른다. 이런 상식답게 자바, C++과 같은 언어는 쓰레드..
darrengwon.tistory.com
https://underflow101.tistory.com/18?category=830633
[Golang] Go Routine (고 루틴) - Golang의 꽃 [기본]
Golang에는 Go Routine(이하 "고루틴")으로 불리는 동시성 예약어가 있다. 즉, main 함수를 돌리면서 순차적이 아니라 익명함수나 함수를 동시에 실행시킬 수 있다는 뜻이다. 바로 아래 예제를 살펴보
underflow101.tistory.com
https://underflow101.tistory.com/17
[Golang] Go Routine (고 루틴) - Golang의 꽃 [심화]
이 론 어느 프로그래밍 언어나 해당 언어만의 강점, 혹은 "꽃"이라고 불릴 만한 것이 있다. 예를 들어 C언어의 꽃이라고 한다면 누가 물어도 "포인터"일 것이며, Python 같은 경우 "Life is too short, you
underflow101.tistory.com
https://www.geeksforgeeks.org/goroutines-concurrency-in-golang/
Goroutines - Concurrency in Golang - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
https://medium.com/trendyol-tech/concurrency-and-channels-in-go-bbc4dea75286
Concurrency and Channels in Go
Concurrency is an important topic to deal with in Software Engineering. We use Go language at Trendyol in many applications and Go comes…
medium.com
동시성과 병렬성 (Concurrency & Parallelism)
이미지1 비동기 작업을 할 때 Concurrency와 Parallelism에 대한 이야기가 자주오고 갑니다. 주로 비동기 작업을 처리하는데 있어 이 두 가지 방법 중 하나를 사용하기 때문이며 구현을 할 때 컴파일러,
vallista.kr
'개발일기 > go' 카테고리의 다른 글
[golang] outlook 메일 전송 (0) | 2024.01.17 |
---|---|
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (0) | 2023.08.03 |
[Golang] Golang 재설치(버전 변경), Golang 설치 (0) | 2022.12.07 |
[go]go lang 시작하기 (0) | 2021.08.02 |