[2019.03.08] Go lang (Channel, Close)
2019. 3. 8. 19:32ㆍ[공부] 영상/GoLanguage
Channel
package main
import "fmt"
func foo(channelBufer chan int, num int) {
channelBuffer <- num * 10
}
func main() {
const loopNum = 5
const bufferSize = 20
fooChannelBuffer := make(chan int, bufferSize)
for i := 0; i < loopNum; i++ {
go foo(fooChannelBuffer, i)
}
var numByChannelArr [loopNum]int
for i := 0; i < loopNum; i++ {
numByChannelArr[i] = <-fooChannelBuffer
}
for i := 0; i < loopNum; i++ {
fmt.Println(numByChannelArr[i])
}
}
40
20
30
0
10
fooChannelBuffer 는 foo channel의 결과가 담길 Queue형 Buffer 다.
fooChannelBuffer := make(chan int, 5) 는 버퍼 사이즈는 5, int 데이터를 나르는 채널 버퍼를 만들겠다는 의미다.
channelBuffer <- 데이터 는 데이터를 channel Buffer 에 넣는 행위를 의미한다
데이터 <- channelBuffer 는 channel Buffer에서 데이터를 빼는 행위를 의미한다.
채널을 이용한 메세지 통신
package main
import "fmt"
import "time"
const loopNum = 5
const bufferSize = 20
func messageProducer(messageChannelBuffer chan string, message string) {
for i := 0; i < loopNum; i++ {
messageChannelBuffer <- message
time.Sleep(time.Millisecond * 100)
}
}
func messageConsumer(messageChannelBuffer chan string) {
for i := 0; i < loopNum; i++ {
messageFromChannel := <- messageChannelBuffer
fmt.Println(messageFromChannel)
}
}
func main() {
messageChannelBuffer := make(chan string, bufferSize)
go messageProducer(messageChannelBuffer, "Hello")
messageConsumer(messageChannelBuffer)
}
Consumer 는 channel에 데이터가 들어올 때 까지 기다린다.
Close
채널을 닫기 위한 키워드
채널이 동작중인데 close 해버리면 에러가 발생한다.
채널이 마무리 된 다음에 호출해야한다. (= 채널의 종료를 모두 기다려야한다 = sync를 맞춰야한다.)
그래서 보통 waitGroupt과 같이 사용함
package main
import "fmt"
import "sync"
var waitGroup sync.WaitGroup
func foo(numByChannel chan int, num int) {
defer waitGroup.Done()
numByChannel <- num * 10
}
func main() {
const loopNum = 5
const bufferSize = 20
fooChannelBuffer := make(chan int, bufferSize)
for i := 0; i < loopNum; i++ {
waitGroup.Add(1)
go foo(fooChannelBuffer, i)
}
waitGroup.Wait()
close(fooChannelBuffer)
for result := range fooChannelBuffer {
fmt.Println(result)
}
}
40
0
10
20
30
'[공부] 영상 > GoLanguage' 카테고리의 다른 글
[2019.03.08] Go lang (Go routine, sync) (0) | 2019.03.08 |
---|---|
[2019.03.08] Go lang (Html template) (0) | 2019.03.08 |
[2019.03.08] Go lang (Map, Defer, Panic, Recover) (0) | 2019.03.08 |
[2019.03.08] Go lang (Struct) (0) | 2019.03.08 |
[2019.03.08] Go lang (서버 제작) (0) | 2019.03.08 |