- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
핵심 정리
이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07
채널채널은 고루틴끼리 데이터를 주고 받고, 실행 순서를 제어하는 기능입니다. 즉, 자료구조의 큐(Queue)와 동기화 객체의 역할을 동시에 수행합니다.
func hello(c chan string) {
c <- "Hello, world!" // 채널에 값을 보냄
}
func main() {
c := make(chan string) // string 채널 생성
go hello(c) // hello를 고루틴으로 실행한 뒤 채널을 매개변수로 넘겨줌
s := <-c // 채널에 값이 들어올 때까지 대기. 값을 꺼내서 s에 대입
fmt.Println(s) // Hello, world!
}
채널을 생성할 때 버퍼를 지정하지 않으면 동기 채널, 버퍼를 지정하면 비동기 채널을 생성합니다.
- 동기 채널: 값을 보내는 쪽에서는 값을 받을 때까지 대기하고, 값을 받는 쪽에서는 채널에 값이 들어올 때까지 대기합니다.
- 비동기 채널: 값을 보내는 쪽에서는 버퍼가 가득 차면 실행을 멈추고 대기하고, 받는 쪽에서는 버퍼에 값이 없으면 대기합니다.
- range: 채널에 값이 들어올 때까지 대기합니다. 값이 들어올 때마다 반복하게 되며 값이 들어오지 않으면 다시 대기합니다. 그리고 채널이 닫히면 range 반복이 종료됩니다.
- close: 채널을 닫습니다. 이미 닫힌 채널을 닫으면 패닉이 발생합니다.
- 보내기 전용 채널:
chan<- 자료형
, 보내기 전용 채널은 값을 보낼 수만 있으며 값을 가져오려고 하면 컴파일 에러가 발생합니다. - 받기 전용(receive-only):
<-chan 자료형
, 받기 전용 채널은range
키워드 또는<- 채널
형식으로 값을 꺼낼 수만 있으며 값을 보내려고 하면 컴파일 에러가 발생합니다.
select는 채널에 값이 들어왔을 때 분기합니다. 그리고 채널에 값을 보낼 수도 있습니다.
for { // 무한 루프
select {
case c1 <- 10: // 매번 채널 c1에 10을 보냄
case s := <-c2: // c2에 값이 들어왔을 때는 값을 꺼낸 뒤 s에 대입
fmt.Println("c2 :", s) // s 값을 출력
case s := <-c3: // c3에 값이 들어왔을 때는 값을 꺼낸 뒤 s에 대입
fmt.Println("c3 :", s) // s 값을 출력
}
}
|형태 및 패키지|함수명|설명| |뮤텍스(sync.Mutex)|Lock|뮤텍스 잠금| | |Unlock|뮤텍스 잠금 해제| |읽기 쓰기 뮤텍스(sync.RWMutex)|Lock|쓰기 뮤텍스 잠금| | |Unlock|쓰기 뮤텍스 잠금 해제| | |RLock|읽기 뮤텍스 잠금| | |RUnlock|읽기 뮤텍스 잠금 해제| |조건 변수(sync.Cond)|NewCond|조건 변수 생성| | | Wait|고루틴 실행을 멈추고 대기| | | Signal|대기하고 있는 고루틴 하나만 깨움| | | Broadcast|대기하고 있는 모든 고루틴을 깨움| |sync.Once|Do|함수를 한 번만 실행| |풀(sync.Pool)|Get|풀에 보관된 객체를 가져옴| | |Put|풀에 객체를 보관| |대기 그룹(sync.WaitGroup)|Add|대기 그룹에 고루틴 개수 추가| | |Done|고루틴이 끝났다는 것을 알려줄 때 사용| | |Wait|모든 고루틴이 끝날 때까지 기다림| |원자적 연산(sync/atomic)|Add 계열|변수에 값을 더하고 결과를 리턴| | |CompareAndSwap 계열|변수 A와 B를 비교하여 같으면 C를 대입, 그리고 A와 B가 같으면 true, 다르면 false를 리턴| | |Load 계열|변수에서 값을 가져옴| | |Store 계열|변수에 값을 저장| | |Swap 계열|변수에 새 값을 대입하고, 이전 값을 리턴|
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.