Goroutines

Go에서 동시성 작업 해보기

package main

import fmt

func main() {
	sexyCount("harry")
	sexyCount("nico")
}

func sexyCount(per string){
	for(i:=0; i<10; i++){
		fmt.Println(person,"is sexy",i)
		time.Sleep(time.Second)
	}
}

위 코드를 실행하면

harry가 10번 실행하고, nico가 이어서 10번 실행된다.

이것이 일반적인 프로그래밍방식이며 이를 Top-Down 방식이라 부른다.

Go에서는 이러한 작업을 더 효율적으로 처리하기 위한 Goroutine이라는 기능을 제공한다.

Goroutines

Go에서는 병렬 처리를 위해 아주 Fun하고 Cool하며 Sexy한 방법을 제공한다.

그 이름하여 Gorotines(고루틴)이라고 부르는 기술인데 Go 세미나에서 한 개발자는 이 고루틴을 보고 이렇게 표현했다.

외계에서 온 기술

그렇다면 지금부터 이 고루틴을 어떻게 쓰는지, 어떤 효과가 있는지 알아보자

package main

import fmt

func main() {
	go sexyCount("harry")
	sexyCount("nico")
}

func sexyCount(per string){
	for(i:=0; i<10; i++){
		fmt.Println(person,"is sexy",i)
		time.Sleep(time.Second)
	}
}

말도안되게 간단하다.

이 코드를 실행하면 harry와 nico가 동시에 수행되는 것을 확인할 수 있다.

단지 go 키워드를 하나 붙인 것 만으로 수행시간을 반으로 줄였다는 의미이다.

그렇다면 nico를 호출하는 함수에도 go를 붙이면 더 빨라지지 않을까?

package main

import fmt

func main() {
	go sexyCount("harry")
	go sexyCount("nico")
}

func sexyCount(per string){
	for(i:=0; i<10; i++){
		fmt.Println(person,"is sexy",i)
		time.Sleep(time.Second)
	}
}

그러나 공교롭게도 이 코드는 아무런 실행결과를 반환하지 않는다.

왜일까?

그것은 고루틴이 프로그램이 실행하는 시간에만 동작하기 때문이다.

즉, main 함수가 종료되면 고루틴 또한 같이 종료된다는 의미이다.

main 함수는 고루틴을 기다려주지 않는다는 마링다.

package main

import fmt

func main() {
	go sexyCount("harry")
	go sexyCount("nico")
	time.Sleep(time.Second*5)
}

func sexyCount(per string){
	for(i:=0; i<10; i++){
		fmt.Println(person,"is sexy",i)
		time.Sleep(time.Second)
	}
}

이를 테스트해보기 위해 강제적으로 메인 함수를 5초정도 잠들게 하더라도 harry와 nico는 4까지 출력하고 하게 된다.

따라서 고루틴의 목숨은 main 함수와 함께한다고 볼 수 있겠다.

Reference

Nomad Coder - 니꼴라스 선생님



© 2022. by minkuk

Powered by minkuk