본문 바로가기

Golang

채널 SELECT 활용

1. 중단알림이 올 때까지 case문을 만나서 여러 채널들을 동시에 실행한다 여러 채널을 동시에 반복하고 싶으면 for문을 넣는다.

package main

import (
	"fmt"
	"sync"
	"time"
)

/*sync.WaitGroup 모든 작업이 완료될때까지 기다린다.*/
func square(wg *sync.WaitGroup, ch chan int, quit chan bool) {
	for {
		select {
		case n := <-ch: /*채널 데이터 넣기*/
			fmt.Printf("Square: %d\n", n*n)
			time.Sleep(time.Second)
		case <- quit:  /*채널 데이터 넣기*/ /*채널종료*/
			wg.Done()
			return
		}
	}
}

func main()  {
	var wg sync.WaitGroup
	/*채널인스턴스 생성*/
	ch := make(chan int)
	quit := make(chan bool)

	wg.Add(1) /*총 작업갯수 1개*/
	go square(&wg, ch, quit) /*고루틴 생성*/

	for i := 0; i<10; i++ {
		ch <- i*2
	}

	quit <- true 
	wg.Wait()
}

 

결과화면

 

 

2. worker pattern으로 중단 알림이 올 때 까지 태스크의 수신 및 처리, 대기를 반복한다. 예제코드를 보면  case 조건을 모두 만족하지 않을 때 default가 있으면 default가 먼저 실행된다.

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	/*특정처리에 실패하면  context.Context타입값을 공유하는 모든 처리를 중단 */
	/*이때 WithCancle함수로  context.Context타입값 반환*/
	ctx,cancle := context.WithCancel(context.Background())
	/*채널인스턴스 생성*/
	task := make(chan int)
	go func ()  {
		for {
			select {
			case <- ctx.Done():
				return 
			/*채널에서 데이터를 빼옴*/
			case i := <-task:
				fmt.Println("get", i)
			default:
				fmt.Println("중단되지 않음")
			}
			time.Sleep(300 * time.Millisecond)
		}
	}()
	time.Sleep(time.Second)
	for i :=0; i<5; i++ {
		task <- i 
	}
	cancle()
}

 

결과 화면

 

 

 

 

 

https://www.yes24.com/Product/Goods/124624242

 

Go 언어로 배우는 웹 애플리케이션 개발 - 예스24

베테랑 고퍼가 알려주는 Go 언어 핸즈온 가이드Go 언어로 REST API 웹 애플리케이션을 개발할 때 반드시 알아야 할 지식을 알려준다. 전반부에는 웹 애플리케이션을 개발하기 전에 알아야 할 Go 언

www.yes24.com

https://www.yes24.com/Product/Goods/99108736

 

Tucker의 Go 언어 프로그래밍 - 예스24

게임 회사 서버 전문가가 알려주는 Go 언어를 내 것으로 만드는 비법구글이 개발한 Go는 고성능 비동기 프로그래밍에 유용한 언어이다. 『Tucker의 Go 언어 프로그래밍』은 Go 언어로 ‘나만의 프로

www.yes24.com

 

'Golang' 카테고리의 다른 글

내장과 상속은 다르다  (0) 2024.02.17