>  기사  >  백엔드 개발  >  Go에서 선택을 기다려야 하는 이유는 무엇입니까?

Go에서 선택을 기다려야 하는 이유는 무엇입니까?

王林
王林앞으로
2024-02-11 08:24:091161검색

Go에서 선택을 기다려야 하는 이유는 무엇입니까?

PHP 편집자 Zimo가 소개했습니다. Go 언어에서 select 문은 동시성 제어를 달성하기 위해 동시에 여러 채널의 작업을 모니터링하는 데 사용되는 매우 중요한 제어 흐름 문입니다. 왜 선택을 기다려야 합니까? 이는 동시 프로그래밍에서는 일반적으로 여러 채널의 데이터나 이벤트를 동시에 처리해야 하며, select 문은 여러 채널을 모니터링하는 데 도움이 될 수 있기 때문입니다. 채널 중 하나가 작동 가능해지면 해당 작업이 수행됩니다. 이를 통해 동시성을 달성합니다. 선택을 사용하면 차단을 효과적으로 방지하고 프로그램의 응답성과 동시성을 향상할 수 있습니다.

질문 내용

방금 컨텍스트 취소를 배웠습니다. 여기 내 코드가 있습니다.

으아악

묻고싶은말

왜 이런 일이 일어나는 걸까요. 나에게 필요한 지식은 무엇인가?

출력이 기대됩니다.

그러나 실제 얻은 출력에는 "해지"가 포함되어 있지 않습니다.

으아악

고정 코드

시간을 추가했습니다.취소 기능 아래에서 취침하세요. 그러면 출력은 내가 예상한 대로입니다.

package main

import (
  "fmt"
  "context"
)

func main() {
  ctx := context.Background()

  do(ctx)
}

func do(ctx context.Context) {
  ctx, ctxCancel := context.WithCancel(ctx)

  resultCh := make(chan string)

  go terminate(ctx, resultCh)

  resultCh <- "value1"
  resultCh <- "value2"

  fmt.Println("pre cancel")

  ctxCancel()

  fmt.Println("post cancel")
}

func terminate(ctx context.Context, ch <-chan string) {
  for {
    select {
    case <-ctx.Done():
      fmt.Println("terminate")
      return
    case result := <-ch:
      fmt.Println(result)
    }
  }
}

해결 방법

내가 이해한 대로 select 사용의 핵심 아이디어는 적어도 하나의 조건이 "준비"가 될 때까지 기다리는 것입니다. 아래에 도움이 될 수 있는 예를 포함시켰습니다. 여기서 select는 채널 ch에서 값이 수신되거나 1초의 시간 초과가 발생할 때까지 기다리는 데 사용됩니다.

으아악

위 내용은 Go에서 선택을 기다려야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제