Goroutine과 Channel

Divan·2022년 12월 13일
3
post-thumbnail
post-custom-banner

면접시에 받았던 고루틴의 대한 질문 정리 + 알파, 이전에 보고 사용했던 내용인데.. 사용을 안하니 머리에서 빠르게 지워지네요 ㅠ

  1. 채널 생성시 make(ch int)와 make(ch int, 2)의 차이는 무엇인가요?
    기본적으로 채널은 make로 메모리 할당이 가능합니다. interger paramter가 채널의 버퍼의 크기를 의미합니다. 기본갑은 0이며, 버퍼의 크기를 정하지 않거나 동기화된 채널에서 사용합니다.
    https://go.dev/doc/effective_go#channels
ci := make(chan int)            // unbuffered channel of integers
cj := make(chan int, 0)         // unbuffered channel of integers
cs := make(chan *os.File, 100)  // buffered channel of pointers to Files
  1. 고루틴에서 채널 Close시에 루틴을 종료하는법.
  • 채널은 특성상 데이터를 수신하지 않으면, 블로킹이 된다.
  • 채널 closing은 더 이상 채널에 보낼 데이터가 없을을 나타냅니다. 이는 채널 리시버들에게 완료 상태를 전달하는데 유용합니다.
  • defer 함수의 마지막에 호출(지연처리)
package main
import "fmt"
func main() {
	intChan := make(chan int)
	go func() {
		defer close(intChan)
		for i := 0; i < 5; i++ {
			intChan <- i
		}
	}()
	for {
		n, ok := <-intChan
		fmt.Printf("%v - %t\n", n, ok)
		if !ok {
			break
		}
	}
}
  1. (참고)서브 고루틴이 종료될때까지 대기
var wg sync.WaitGroup

wg.Add(3) // 작업 개수 설정
wg.Done() // 작업이 완료될 때마다 호출
wg.Wait() // 모든 작업이 완료될 때까지 대기

예제

import (
	"fmt"
	"sync"
)
var wg sync.WaitGroup
func sum() {
	sum := 0
	for i := 0; i < 1000; i++ {
		sum += i * i
	}
	fmt.Println("다음숫자는 : ", sum)
	wg.Done()
}
func main() {
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go sum()
	}
	wg.Wait()
}

위 코드에서 wg.Add(int)여기서 파라미터값이 생성하고자하는 루틴의 값과 같아야한다. 만약 "goroutine 수 > param"이면 param의 수 까지만 종료를 보장 받을수있다. 반대로 "goroutine 수 < param"이면 아래와 같은 error를 발생한다.
all rorutines are asleep deadlock

profile
하루 25분의 투자
post-custom-banner

0개의 댓글