Goroutines
in Programming Language on Go
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 - 니꼴라스 선생님