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
https://www.yes24.com/Product/Goods/99108736
'Golang' 카테고리의 다른 글
내장과 상속은 다르다 (0) | 2024.02.17 |
---|