프로그래밍 언어/GO

Go routine이 무엇일까?

KYBee 2022. 10. 23. 18:06

프로세스, 스레드, Go routine 

  • 프로그램 : 프로세스의 명령어와 사용자 데이터를 초기화하는데 사용할 명령어와 데이터를 담은 파일
  • 프로세스 : 명령어, 사용자 데이터, 시스템 영역, 실행 과정에 수집한 다양한 종류의 리소스로 구성된 독립적인 실행 단위
  • 스레드 : 프로그램이나 프로세스보다 좀 더 가볍고 작은 실행 단위. 프로세스에 의해 생성되며 독립적인 제어 흐름과 스택을 가짐
  • Go routine : Go 프로그램에서 동시에 실행할 수 있는 최소 단위.
    • OS가 아닌 프로그램에서 Time-Sharing이 이루어짐
    • 프로세스나 스레드를 OS에 요청하지 않고, 자체적으로 해결함. 프로세스, 스레드의 Context Switching 보다 비용적으로 우수함
    • 프로세스나 스레드에 종속되지 않으므로, 1개의 스레드에서 1개 이상의 Go routine이 Time-Sharing되어 처리될 수 있다.

 

Go routine 사용 예시

Go routine을 사용하기 위해서는 go 키워드를 실행하려는 함수 앞에 적어주면 된다.

 

Go routine을 사용하지 않은 경우 : 순차적으로 실행된다.

package main

import "fmt"

func f1() {
	for i := 0; i < 5; i++ {
		fmt.Println("f1 실행 중")
	}
}

func f2() {
	for i := 0; i < 5; i++ {
		fmt.Println("f2 실행 중")
	}
}

func main() {
	fmt.Println("starting")
	f1()
	f2()
	fmt.Println("end")
}

Go routine을 사용한 경우 : 동시에 실행된다.

package main

import (
	"fmt"
	"time"
)

func f1() {
	for i := 0; i < 5; i++ {
		fmt.Println("f1 실행 중")
	}
}

func f2() {
	for i := 0; i < 5; i++ {
		fmt.Println("f2 실행 중")
	}
}

func main() {
	fmt.Println("starting")
	go f1()
	go f2()

	time.Sleep(5 * time.Second)
	fmt.Println("end")
}