Go Channel 사용법
https://www.ardanlabs.com/blog/2017/10/the-behavior-of-channels.html
예제 - 비동기 작업 종료 기다리기
고루틴이 한개인 경우
func example() bool {
done := make(chan struct{})
go func() {
// jobs
close(done)
}()
select {
case <-done:
}
return true
}
고루틴이 여러 개인 경우
func example2() bool {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
// jobs 1
}()
go func() {
defer wg.Done()
// jobs 2
}()
wg.Wait()
return true
}
Timeout이 필요한 경우
func exampleTimeout() bool {
done := make(chan struct{})
go func() {
// jobs
close(done)
}()
select {
case <-done:
case <-time.After(10 * time.Second)
return false
}
return true
}
고루틴이 여러개인데 Timeout도 필요한 경우
func example2Timeout() bool {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
// jobs 1
}()
go func() {
defer wg.Done()
// jobs 2
}()
done := make(chan struct{})
go func() {
wg.Wait()
close(done)
}()
select {
case <-done:
case <-time.After(10 * time.Second):
return false
}
return true
}
데이터 수신하기
채널 닫기로 종료
func example(receiveCh <-chan string) bool {
go func() {
Loop:
for {
select {
case data := <-receiveCh:
// job with data
default:
break Loop
}
}
}()
return true
}
func example(receiveCh <-chan string) bool {
go func() {
for data := range receiveCh {
// job with data
}
}()
return true
}
receiveCh
를 종료해서 수신 종료
종료를 알려주는 별도 채널 사용
func example(receiveCh <-chan string, stopCh <-chan int) bool {
go func() {
Loop:
for {
select {
case data := <-receiveCh:
// job with data
case <-stopCh:
break Loop
}
}
}()
return true
}