
동시에 실행되는 함수
고루틴 : 동시성을 구현할 때 다른 언어의 스레드 등 방식과 차별화된 방법 제시
package main
import (
"fmt"
"time"
)
func counter(s string, n int) {
for i := 0; i < n; i++ {
time.Sleep(time.Second)
fmt.Println(s, " : ", i)
}
}
func main() {
go counter("a", 10)
go func() {
counter("b", 10)
}()
go func() {
for i := 0; i < 10; i++ {
time.Sleep(time.Second)
fmt.Println("c : ", i)
}
}()
counter("d", 10)
}
var wg sync.WaitGroup //WaitGroup 선언
wg.Add(1) //WaitGroup 추가
defer wg.Done() //goroutine 종료, WaitGroup에서 1개의 goroutine 삭제
wg.Wait() //해당 선언 시점까지 WaitGroup내 모든 goroutine 종료 대기
//예제
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
i := i
go func() {
defer wg.Done()
counter(i)
}()
}
wg.Wait()
코드를 입력하세요
채널 : 고루틴 함수들 사이에서 데이터를 주고 받거나, 흐름 제어를 하기 위해 채널 필요

채널 ← : 채널에 값을 전달
← 채널 : 채널에서 값을 가져오기
버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역
버거되지 않는 채널 : 동기 통신 수행, 즉시 교환 보장
버퍼된 채널 : 비동기 통신 수행, 즉시 교환 보장 안됨
// 버퍼의 수는 make 함수의 두번째 인자로 설정합니다.
ci := make(chan int) // 정수형 채널
cj := make(chan int, 0) // 정수형 채널
cs := make(chan *os.File, 100) // File 포인터형의 버퍼된 채널
채널을 매개변수로 받는 함수를 실행하기 위해선 go를 붙여서 고루틴으로 만들어야 함
func calc(wg *sync.WaitGroup, ch chan int) {
// 내용 생략
}
func main() {
var wg sync.WaitGroup
ch := make(chan int)
go calc(&wg, ch)
}
switch와 유사하지만, case에 채널 사용
ping := time.Tick(100 * time.Millisecond)
pong := time.After(500 * time.Millisecond)
for {
select {
case <-ping:
fmt.Println("ping")
case <-pong:
fmt.Println("pong")
return //주석처리후 테스트
default:
fmt.Println("-")
time.Sleep(50 * time.Millisecond)
}
}
마치 여러 가지 일을 동시에 하는 것처럼 느껴지게 시분할 처리하는 것을 의미
고루틴 + 채널로 구현
특정 순간에 여러 작업이 동시에, 병렬로 실행되는 것
여러 코어에서 작업이 진행되기에 진정한 동시 실행
go GOMAXPROCS를 사용해 cpu 개수 설정해 병렬성 구현 가능
