고루틴 사용하기


이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07


고루틴(Goroutine)은 함수를 동시에 실행시키는 기능입니다. 다른 언어의 스레드 생성 방법보다 문법이 간단하고, 스레드보다 운영체제의 리소스를 적게 사용하므로 많은 수의 고루틴을 쉽게 생성할 수 있습니다.

  • go 함수
package main

import "fmt"

func hello() {
	fmt.Println("Hello, world!")
}

func main() {
	go hello() // 함수를 고루틴으로 실행

	fmt.Scanln() // main 함수가 종료되지 않도록 대기
}

함수를 호출할 때 앞에 go 키워드를 붙이면 해당 함수는 고루틴으로 실행됩니다. 여기서는 hello 함수를 고루틴으로 실행합니다. 고루틴으로 hello 함수를 실행하면 main 함수와 동시에 실행되기 때문에 hello 함수 안의 fmt.Println이 호출되기 전에 main 함수가 종료되어버립니다. 따라서 fmt.Scanln을 사용하여 main 함수가 종료되지 않도록 대기합니다(엔터를 입력하면 대기를 끝냅니다).

다음은 반복문을 사용하여 고루틴을 100개 생성합니다.

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func hello(n int) {
	r := rand.Intn(100)          // 랜덤한 숫자 생성
	time.Sleep(time.Duration(r)) // 랜덤한 시간 동안 대기
	fmt.Println(n)               // n 출력
}

func main() {
	for i := 0; i < 100; i++ { // 100번 반복하여
		go hello(i)        // 고루틴 100개 생성
	}

	fmt.Scanln()
}

고루틴 100개를 동시에 실행하면서 각 고루틴은 랜덤한 시간동안 대기합니다. rand.Intn 함수에 100을 넣으면 0부터 100까지 랜덤한 숫자를 리턴합니다. 그리고 time.Sleep 함수를 사용하여 설정한 시간동안 대기합니다. 여기서 time.Sleep 함수에 값을 넣을 때는 time.Duration 타입으로 변환해줍니다.

time.Duration
1초를 각 단위로 표현하면 다음과 같습니다.

  • 나노초: 1000000000 (1/1,000,000,000초)
  • 마이크로초: 1000000 (1/1,000,000초)
  • 밀리초: 1000 (1/1,000초)

time.Duration은 int64 타입이며 나노초 단위입니다. Go 언어에서는 각 초단위로 상수를 제공하므로 곱셈을 통해 시간을 표현할 수 있습니다.

const (
	Nanosecond  Duration = 1
	Microsecond          = 1000 * Nanosecond
	Millisecond          = 1000 * Microsecond
	Second               = 1000 * Millisecond
	Minute               = 60 * Second
	Hour                 = 60 * Minute
)
  • 10초: time.Second * 10
  • 35마이크로초: time.Microsecond * 35
  • 120밀리초: time.Millisecond * 120

고루틴을 종료하려면 함수안에서 return으로 빠져나오거나 runtime.Goexit 함수를 사용하면 됩니다. 단, 리턴값은 사용할 수 없습니다(return에 값이나 변수를 지정하더라도 무시됩니다).


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015