| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- toggle
- localStorage
- Server
- Vue
- websocket
- todo-list
- graceful shutdown
- TODO
- golang
- SFC
- channel
- method
- App.vue
- cli
- Vue.js
- reactivity
- PROPS
- emit
- component
- CDN
- container
- Dictionary
- go
- goroutine
- goroutines
- URL
- map
- 행렬
- Matrix
- Refactoring
Archives
- Today
- Total
ksundev 님의 블로그
Channels 본문
Channel?
1. 코드 분석
현재 우리가 살펴볼 코드는 Go 언어의 채널을 사용한 간단한 예제입니다:
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan bool)
people := [2]string{"KSun", "Peter"}
for _, person := range people {
go isReady(person, c)
}
fmt.Println(<-c)
fmt.Println(<-c)
}
func isReady(person string, c chan bool) {
time.Sleep(time.Second * 5)
fmt.Println(person, "is ready")
c <- true
}
2. 코드 동작 과정
2.1 채널 생성
c := make(chan bool)
bool타입의 언버퍼드 채널을 생성합니다- 이 채널은 고루틴 간의 통신을 위한 파이프 역할을 합니다
2.2 고루틴 시작
people := [2]string{"KSun", "Peter"}
for _, person := range people {
go isReady(person, c)
}
- 두 개의 고루틴을 동시에 시작합니다
- 각 고루틴은
isReady함수를 실행하며, 같은 채널c를 공유합니다
2.3 고루틴 함수 분석
func isReady(person string, c chan bool) {
time.Sleep(time.Second * 5) // 5초 대기
fmt.Println(person, "is ready")
c <- true // 채널에 true 값 전송
}
- 각 고루틴은 5초 동안 대기한 후
- 준비 완료 메시지를 출력하고
- 채널에
true값을 전송합니다
2.4 메인 고루틴에서 결과 수신
fmt.Println(<-c) // 첫 번째 고루틴 완료 대기
fmt.Println(<-c) // 두 번째 고루틴 완료 대기
<-c는 채널에서 값을 수신하는 연산입니다- 각각
true값을 받아서 출력합니다
3. 실행 결과 예상
이 코드를 실행하면 다음과 같은 결과가 나옵니다:
KSun is ready
Peter is ready
true
true또는
Peter is ready
KSun is ready
true
true순서는 보장되지 않습니다! 고루틴이 동시에 실행되므로 어떤 고루틴이 먼저 완료될지는 실행할 때마다 다를 수 있습니다.
4. 핵심 개념 설명
4.1 동시성 (Concurrency)
- 두 개의 고루틴이 동시에 실행됩니다
- 각각 5초씩 대기하지만, 총 실행 시간은 5초입니다 (병렬 실행)
4.2 채널 통신
- 채널은 고루틴 간의 안전한 통신을 보장합니다
c <- true: 송신 (send)<-c: 수신 (receive)
4.3 동기화
- 메인 고루틴은 두 개의 고루틴이 모두 완료될 때까지 기다립니다
- 채널을 통해 고루틴의 완료 신호를 받습니다
5. 코드의 장점
- 간단함: 복잡한 동기화 코드 없이도 고루틴 완료를 기다릴 수 있습니다
- 안전성: 채널을 통한 통신으로 레이스 컨디션을 방지합니다
- 효율성: 두 작업을 병렬로 처리하여 전체 실행 시간을 단축합니다
6. 주의사항
- 언버퍼드 채널을 사용하므로 송신과 수신이 동시에 준비되어야 합니다
- 고루틴의 실행 순서는 보장되지 않습니다
- 채널을 닫지 않아도 프로그램이 정상적으로 종료됩니다 (가비지 컬렉터가 처리)
개인적으로 <- 문법이 꽤 신기하면서 매력적으로 느껴졌습니다. ㅋㅋㅎ
이번 포스트는 여기까지입니다. 다음 포스트에서는 복습을 할 계획입니다!
'[개발] Go > 중급 프로젝트' 카테고리의 다른 글
| [WebSocket] 채팅방 데모버전 만들어보기 (backend) (2) | 2025.08.26 |
|---|---|
| [URL Checker][New] Go Routine을 장착한 빠른 URL Checker🔥 (1) | 2025.07.14 |
| Channels 2 - chan 타입 바꾸고 반복문 활용하기 (1) | 2025.07.14 |
| Goroutines (0) | 2025.06.27 |
| [URL Checker] hitURL 그리고 느린 URL Checker (순차적) (0) | 2025.06.26 |