Go 동시성 프로그래밍 하기

Goroutine

  • 고루틴은 함수를 동시에 실행시키는 기능이다.
  • 다른 언어의 쓰레드보다 운영체제의 리소스를 적게 사용한다.

클로저

  • 클로저를 고루틴으로 실행할 때 반복문에 의해 바뀌는 변수는 반드시 매개변수로 넘겨 준다.

멀티코어 활용

체널 사용

  • 채널은 고루틴끼리 정보를 교환하고 실행의 흐름을 동기화하기 위해 사용한다.
  • 채널 생성시 보내기 전용 이나 받기 전용으로 생성 가능한다.

package main

import "fmt"

func sum(a int, b int, c  chan int) {
  c <- a + b
}

func main() {
    c := make(chan int)

    go sum(1 ,2 ,c)
    n := <-c
    fmt.Println(n)
}

range close 사용하기

  • close 는 채널을 닫을 수 있으며 이미 닫은 채널을 닫게되면 패닉 발생
  • 채널을 닫으면 range 루프가 종료 됩니다.
  • 채널이 열려 있고 값이 들어 오지 않으면 range 는 실행되지 않고 계속 대기 한다.

package main

import "fmt"

func main()

    c:= make(chan int)
    go func() {
    for i := 0; i >5 i++{
    c <- i // 채널에 값을 보냄
    }
    close(c)
}()

   for i:= range c {
    fmt.Println(i)
    }
}

Select 사용하기

  • Go 언어는 여러 채널을 손쉽게 사용할 수 있도록 select 분기문을 지원
  • select문은 지정한 채널의 데이터가 있을 경우 case 수행한다.
  • select문에서는 지정한 체널에 데이터를 보내는 case는 항상 수행 된다.

for{
  case c1 <- 10: // 매번 체널 c1 에 값을 보냄
  case s:= <-c2: // c2 값이 들어 왔을때는 값을 꺼낸뒤 s에 대입
   }

동기화 객체

  • Mutex: 뮤텍스 ,상호 배제, 공유 데이터 보호에 주로 사용
  • RWMutex: 읽기/쓰기 뮤텍스 입니다. 일기와 쓰기 동작을 나누어서 잠금을 걸수 있습니다.
  • Cond: 조건 변수 (condition variable) 입니다. 대기하고 있는 하나이상의 객체를 깨울수 있다.
  • Once: 특정함수를 딱 한번만 실행할때 사용합니다.
  • Pool: 멀티 쓰레드 (고루틴)에서 사용할 수 있는 객체풀 입니다. 자주 사용하는 객체를 풀에 보관하여 사용가능 하다.
  • WaitGroup:고루틴이 모두 끝날 때까지 기다리는 기능
  • Atomic: 원자적 연산이라고도 하며 더 이상 쪼갤 수 없는 연산 의미 고루틴에서 안전하게 값을 연산하는 기능 입니다.
comments powered by Disqus