본문 바로가기
개발/Go

[Go] 기초 - 루틴(goroutine)

by devhooney 2022. 8. 2.
728x90

1. Go루틴

- Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드이다.

- Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다.

- goroutine은 비동기적으로 함수루틴을 실행한다. 이를 통해 여러 코드를 동시에 실행한다.

package main
 
import (
    "fmt"
    "time"
)
 
func say(s string) {
    for i := 0; i < 10; i++ {
        fmt.Println(s, "***", i)
    }
}
 
func main() {
    // 함수를 동기적으로 실행
    say("첫 번째 함수 실행")
 
    // 함수를 비동기적으로 실행
    go say("두 번째?")
    go say("세 번째?")
    go say("네 번째?")
 
    // 3초 대기
    time.Sleep(time.Second * 3)
}

- say() 함수를 동기적으로 호출하고, 다음으로 go키워드를 붙여서 say() 함수를 3번 호출

- 첫 번째 say() 함수 실행 후, 다음 3개의 go say() 함수가 실행.

- 3개의 go say() 함수가 실행되면서 time.Sleep을 실행한다.

- goroutine들은 실행순서가 일정하지 않으므로 실행 시 마다 다른 출력 결과를 나타낼 수 있다.

 

2. 다중 CPU 처리

- Go는 기본적으로 1개의 CPU를 사용한다.

- 여러 개의 Go 루틴을 만들더라도, 1개의 CPU에서 작업을 시분할하여 처리한다 (Concurrent 처리).

- 만약 머신이 복수개의 CPU를 가진 경우, Go 프로그램을 다중 CPU에서 병렬처리 (Parallel 처리)하게 할 수 있는데, 병렬처리를 위해서는 아래와 같이 runtime.GOMAXPROCS(CPU수) 함수를 호출하여야 한다.(여기서 CPU 수는 Logical CPU 수를 가리킨다.)

package main
 
import (
    "runtime"  
)
 
func main() {
    // 4개의 CPU 사용
    runtime.GOMAXPROCS(4)
 
    //...
}

 

728x90

 

3. Concurrency vs Parallelism 

https://umi0410.github.io/blog/golang/go-concurrency-vs-parallelism/

 

Go 언어로 적용해보는 Computer Science - Concurrency vs Parallelism

Golang을 공부하면서 너무나도 헷갈렸던 Concurrency에 대해 Parallelism과 비교하며 정리했습니다. 추상적인 내용보단 예시와 프로그램을 통한 벤치마킹을 통해 어떤 경우를 동시성이라고 하는지 어떤

umi0410.github.io

- 이 블로그를 참조했다.

 

- 예를 들어 사회적 거리 두기로 인해 우리 Gopher(고퍼)가 친구들과 떠나려는 예약했던 여행이 취소되었고, 항공권, 호텔, 렌트카 예약을 모두 취소해야하는 상황

 

(1)동시성(Concurrent)의 예시 - 만약 모든 취소 작업이 고객센터 1대1 채팅으로 이루어지는 경우. Gopher1 혼자 모든 취소 작업을 동시적으로 수행 가능

> Gopher1 혼자 항공권 취소 신청, 호텔, 렌트카의 고객센터 1대1 채팅에 예약 취소 신청을 함

> 상담사분이 답장을 주는 대로 작업을 진행

Gopher1 혼자서 세 개의 취소 작업을 동시에 진행하는 셈이다.

 

(2) 병렬성(Parallelism)의 예시 - 만약 모든 취소 작업이 고객센터 전화 상담으로 이루어 지는 경우. Gopher1 혼자 모든 취소 작업을 동시에 진행할 수는 없고, Gopher 1, 2, 3이 병렬적으로 진행할 순 있음.

 

 

- 나는 개발하면서 다중 CPU처리는 해보지 못했다.

- 고 루틴도 한 번 사용해봤으며 사용하면서 에러를 마니 겪었던 기억이 있다.

- 이론 공부를 해보고 토이 프로젝트라도 진행해보면서 다시 복습을 해봐야겠다.

- 자바 공부와 병행하느라 너무 힘들다 ㅠㅠ 요새 느끼는건 너무 욕심을 부리느라 다 놓치는게 아닐까 싶다...

728x90

'개발 > Go' 카테고리의 다른 글

[Go] 기초 - 채널  (0) 2022.08.04
[Go] 기초 - defer&panic  (0) 2022.08.01
[Go] 기초 - Error  (0) 2022.07.31
[Go] 기초 - 인터페이스  (0) 2022.07.30
[Go] 기초 - 메소드  (1) 2022.07.27