Go Lang 기초 14 - 고 루틴(Go Routine)

만두아빠·2021년 8월 2일
1

Go Lang 기초

목록 보기
14/14
post-thumbnail

Go Lang에서는 동시에 실행되는 작업을 Go Routine이라고 부릅니다. 다른 프로그래밍언어에서 쓰레드(Thread)라고 부르는 것과 유사한 개념이지만, Go Routine은 OS 쓰레드와 1 대 1로 대응되지 않고 훨씬 적은 OS 쓰레드를 사용합니다. 따라서 한 번에 더 많은 Go Routine을 실행할 수 있습니다.

Go Routine은 사용하기도 매우 간편합니다.
go 함수명()

동시성(Concurrent)은 싱글 코어의 경우에서 스레드를 여러 개 만들어서 마치 동시에 실행되는 것'처럼' 보이도록 하는 것입니다.

병렬성(parallel)은 멀티 코어에서 실제로 나눠서 작업을 동시에 처리하는 것을 말합니다.

동시성을 구현하기 위해 사용되는 개념이 멀티프로세싱과 멀티쓰레딩입니다.

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이며, 쓰레드는 프로세스가 할당받는 자원을 이용하는 실행의 단위를 말합니다.

동시성을 지원하도록 작성된 프로그램은 여러 작업을 동시에 실행하는 병렬성도 지원할 수 있습니다. 이를 통해 프로그램의 속도를 크게 향상시킬 수 있습니다.

package main

import (
	"fmt"
	"time"
)

func printa() {
	for i := 0; i < 10; i++ {
		fmt.Print("A")
	}
}

func printb() {
	for i := 0; i < 10; i++ {
		fmt.Print("B")
	}
}

func printc() {
	for i := 0; i < 10; i++ {
		fmt.Print("C")
	}
}

func main() {
	go printa()
	go printb()
	go printc()
	time.Sleep(time.Second)
	fmt.Println("\nGo Routine End")
}

출력결과물

BCCCCCCCCCCBABBBBBBBBAAAAAAAAA
Go Routine End

출력결과물이 함수 위치순서대로가 아니라 뒤섞여있는 이유는, Go Routine을 통해 세가지 함수가 동시에 실행되기 때문입니다. 따라서 출력결과물은 실행시킬 때마다 매번 조금씩 다르게 나타나실 겁니다.

CPU를 최대한 활용하려면 runtime.NumCPU()를 사용합니다.

package main

import (
	"fmt"
	"time"
)

func printa() {
	for i := 0; i < 10; i++ {
		fmt.Print("A")
	}
}

func printb() {
	for i := 0; i < 10; i++ {
		fmt.Print("B")
	}
}

func printc() {
	for i := 0; i < 10; i++ {
		fmt.Print("C")
	}
}

func main() {
	fmt.Println(runtime.NumCPU())
	runtime.GOMAXPROCS(runtime.NumCPU())

	go printa()
	go printb()
	go printc()
	time.Sleep(time.Second)
	fmt.Println("\nGo Routine End")
}

출력결과물

12
AAAAAAAAAABBBBBBBBBBCCCCCCCCCC
Go Routine End

go 1.5 버전 이상부터는 runtime.GOMAXPROCS()를 따로 설정하지 않으면 모든 CPU를 활용하는 것이 기본입니다. runtime.GOMAXPROCS(4) 등을 통해 활용 CPU의 수를 조절합니다.

profile
Velog는 잠시 쉬어갑니다! 아래의 링크로!

0개의 댓글