Archive/Go

Go 'URL CHECKER & GO ROUTINES' : Channels

nimkoes 2021. 5. 23. 16:43
728x90

 

 

Channel 은 goroutine 과 main function 사이 또는 goroutine 간 정보 전달을 하기 위한 방법 이다.

앞서 make 가 map 을 만들기 위한 function 이라고 정리 했었는데, make function 은 slice, map 그리고 channel 을 만들 수 있는 function 이 맞는것 같다.

 

 

아무튼, 이번에는 channel 이라는 것을 사용해보려 한다.

코드에 대한 설명은 주석에 작성 하였다.

 

package main

import (
	"fmt"
	"time"
)

func main() {

	// 길이 2 의 문자열 배열 생성
	people := [2]string{"nico", "nimkoes"}

	// bool 타입을 주고받을 수 있는 channel 생성, c 는 임의의 이름으로 사용 가능
	c := make(chan bool)

	// 반복문을 실행 하면서 두 개의 goroutine 을 실행
	for _, person := range people {
		// channel 을 같이 전달
		go isSexy(person, c)
	}

	// main function 은 channel 로부터 받는 값을 기다린다.
	// 기다린다는 것은 스레드를 종료하지 않는다는 것을 의미한다.
	fmt.Println(<-c)
	fmt.Println(<-c)
}

func isSexy(person string, c chan bool) {
	// 5초 동안 스레드를 멈춘다.
	time.Sleep(time.Second * 5)
	fmt.Println(person)

	// channel 로 bool 값을 전달한다.
	c <- true
}

 

 

실행 결과를 보면 main function 이 goroutine 을 실행하고 바로 종료하지 않고, channel 을 통해 값을 전달 받기를 기다리는 것을 확인할 수 있다.

 

추가로 확인할 수 있는건, person 과 bool 결과가 쌍을 이루지 않고 person 을 모두 출력한 다음 bool 결과를 출력 하였는데, 그 이유는 각 스레드가 병렬 처리 되고 있기 때문이다.

 

여러번 실행 하다보면 다음과 같이 person 다음에 bool 값을 출력하는 것도 볼 수 있다.

 

 

 

 

 

728x90