ksundev 님의 블로그

Channels 본문

[개발] Go/중급 프로젝트

Channels

ksundev 2025. 6. 27. 15:25

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. 코드의 장점

  1. 간단함: 복잡한 동기화 코드 없이도 고루틴 완료를 기다릴 수 있습니다
  2. 안전성: 채널을 통한 통신으로 레이스 컨디션을 방지합니다
  3. 효율성: 두 작업을 병렬로 처리하여 전체 실행 시간을 단축합니다

6. 주의사항

  • 언버퍼드 채널을 사용하므로 송신과 수신이 동시에 준비되어야 합니다
  • 고루틴의 실행 순서는 보장되지 않습니다
  • 채널을 닫지 않아도 프로그램이 정상적으로 종료됩니다 (가비지 컬렉터가 처리)

개인적으로 <- 문법이 꽤 신기하면서 매력적으로 느껴졌습니다. ㅋㅋㅎ
이번 포스트는 여기까지입니다. 다음 포스트에서는 복습을 할 계획입니다!