2015년 7월 20일 월요일

GO 언어 기본 문법 - 6

----------고루틴 사용하기-----------
고루틴은 함수를 동시에 실행시키는 기능이다
다른 언어의 스레드 생성보다 문법이 간단하고, 스레드 보다 리소스를 적게 사용한다

함수 호출 시에 go 키워드를 붙이면 해당 함수는 고루틴으로 실행된다.

예제)
package main

import "fmt"

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

func main() {
   go hello           //함수를 고루틴으로 실행
   fmt.Scanln()       //main 함수가 종료되지 않도록 대기
}

------------멀티코어 활용하기-------------
GO 언어는 CPU 코어를  한 개만 사용하도록 설정되어 있다.
다음은 시스템의 모든 CPU 코어를 사용하는 방법이다.

package main

import (
   "fmt"
   "runtime"
)

func main() {
     //CPU 개수를 구한 뒤 사용할 최대 CPU 개수 설정
   runtime.GOMAXPROCS(runtime.NumCPU()) 
   fmt.Println(runtime.GOMAXPROCS(0))  //설정 값 출력
   s := "Hello, world!"

   for i:=0; i<100; i++ {
       go func(n int) {  //익명 함수를 고루틴으로 실행
          fmt.Println(s, n)
       }(i)
   }

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

-----------채널 사용하기-------------
채널은 고루틴끼리 데이터를 주고 받고, 실행 흐름을 제어하는 기능
make(chan 자료형)

예제)
package main

import "fmt"

func sum(a int, b int, c int) {
   c <- a+b   //채널에 a와 b의 합을 보냄
}

func main() {
   c := make(chan int)  //int 형 채널 생성
   go sum(1, 2, c)        //sum을 고루틴으로 실행한 뒤 채널을 매개변수로 넘겨줌
   n := <-c                //채널에서 값을 꺼낸 뒤 n에 대입
   fmt.Println(n)          //3
}

채널을 사용하기 전에는 반드시 make 함수로 공간을 할당
채널을 매개변수로 받는 함수는 반드시 go키워드를 사용하여 고루틴을 실행해야 한다

함수에서 채널을 매개변수로 받을 때는
변수명 chan 자료형 
형식으로 한다

채널에 값을 보낼 때
채널 <- 값

채널에서 값을 가져올 때
<- 채널

채널 버퍼링
make(chan 자료형, 버퍼개수)

채널에 버퍼를 1개이상 설정하면 비동기 채널이 생성된다.
비동기 채널은 보내는 쪽에서 버퍼가 가득 차면 실행을 멈추고 대기하며
받는 쪽에서는 버퍼에 값이 없으면 대기한다.

Go언어는 여러 채널을 손쉽게 사용할 수 있도록 select 분기문을 제공
select {case <-채널:코드}

select {
case <-채널1:
  //채널1에 값이 들어왔을 때 실행할 코드를 작성
case <-채널2:
  //채널2에 값이 들어왔을 때 실행할 코드를 작성
default:
  //모든 case의 채널에 값이 들어오지 않았을 때 실행할 코드를 작성
}


댓글 없음:

댓글 쓰기