[TIL] Go 특강 Day-3

드림보이즈·2023년 5월 10일

고루틴

동시에 실행되는 함수

고루틴 : 동시성을 구현할 때 다른 언어의 스레드 등 방식과 차별화된 방법 제시

  • 독립적 실행, 동시에 실행되는 내장함수
  • 동일한 주소 공간에서 다른 고루틴과 동시에 실행 가능
  • 가볍지만, 스택 공간할당보다 비용이 큼
  • go 키워드 사용, 완료 후 고루틴 자동 종료
package main

import (
    "fmt"
    "time"
)

func counter(s string, n int) {
    for i := 0; i < n; i++ {
        time.Sleep(time.Second)
        fmt.Println(s, " : ", i)
    }
}

func main() {

    go counter("a", 10)

    go func() {
        counter("b", 10)
    }()
    go func() {
        for i := 0; i < 10; i++ {
            time.Sleep(time.Second)
            fmt.Println("c : ", i)
        }
    }()

    counter("d", 10)
}

고루틴 대기 활용 WaitGroup

var wg sync.WaitGroup //WaitGroup 선언
wg.Add(1) //WaitGroup 추가
defer wg.Done() //goroutine 종료, WaitGroup에서 1개의 goroutine 삭제
wg.Wait() //해당 선언 시점까지 WaitGroup내 모든 goroutine 종료 대기

//예제
var wg sync.WaitGroup

for i := 1; i <= 5; i++ {
	wg.Add(1)

	i := i
	go func() {
		defer wg.Done()
		counter(i)
	}()
}

wg.Wait()
코드를 입력하세요

채널

채널 : 고루틴 함수들 사이에서 데이터를 주고 받거나, 흐름 제어를 하기 위해 채널 필요

  • 고루틴 간 리소스, 데이터 공유하는데 사용
  • 고루틴 간 파이프 역할을 하여 동기 교환을 보장
  • 채널 선언 시 자료형 지정
  • 주어진 시간에 하나의 고루틴만 데이터 항목에 액세스할 수 있으므로 설계상 데이터 경쟁이 발생할 수 없음
  • <- 로 채널 호출 표현

채널 ← : 채널에 값을 전달
← 채널 : 채널에서 값을 가져오기

버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역

버거되지 않는 채널 : 동기 통신 수행, 즉시 교환 보장

버퍼된 채널 : 비동기 통신 수행, 즉시 교환 보장 안됨

// 버퍼의 수는 make 함수의 두번째 인자로 설정합니다.
ci := make(chan int)            // 정수형 채널
cj := make(chan int, 0)         // 정수형 채널
cs := make(chan *os.File, 100)  // File 포인터형의 버퍼된 채널

채널을 매개변수로 받는 함수를 실행하기 위해선 go를 붙여서 고루틴으로 만들어야 함

func calc(wg *sync.WaitGroup, ch chan int) {
	// 내용 생략
}

func main() {
	var wg sync.WaitGroup
	ch := make(chan int)
	go calc(&wg, ch)
}

Select

switch와 유사하지만, case에 채널 사용

	ping := time.Tick(100 * time.Millisecond)
	pong := time.After(500 * time.Millisecond)
	for {
		select {
		case <-ping:
			fmt.Println("ping")
		case <-pong:
			fmt.Println("pong")
			return      //주석처리후 테스트
		default:
			fmt.Println("-")
			time.Sleep(50 * time.Millisecond)
		}
	}

동시성 concurrency

마치 여러 가지 일을 동시에 하는 것처럼 느껴지게 시분할 처리하는 것을 의미

고루틴 + 채널로 구현

병렬성 parallelism

특정 순간에 여러 작업이 동시에, 병렬로 실행되는 것

여러 코어에서 작업이 진행되기에 진정한 동시 실행

go GOMAXPROCS를 사용해 cpu 개수 설정해 병렬성 구현 가능

profile
시리즈 클릭하셔서 카테고리 별로 편하게 보세용

0개의 댓글