>백엔드 개발 >Golang >sync.WaitGroup 고루틴에 chan 작성

sync.WaitGroup 고루틴에 chan 작성

PHPz
PHPz앞으로
2024-02-09 17:00:10696검색

在sync.WaitGroup goroutine中写入chan

PHP 편집기 Yuzi가 sync.WaitGroup 고루틴에서 chan을 작성하는 방법을 소개합니다. 동시 프로그래밍에서 sync.WaitGroup은 고루틴 그룹의 실행이 완료될 때까지 기다릴 수 있는 매우 유용한 동기화 메커니즘입니다. 그러나 때로는 다른 고루틴이 사용할 수 있도록 고루틴 실행이 완료된 후 결과를 chan에 써야 하는 경우도 있습니다. 이번 글에서는 sync.WaitGroup 고루틴에서 이 함수를 구현하는 방법을 자세히 소개하겠습니다. 살펴보겠습니다!

질문 내용

API 엔드포인트에서 항목 목록을 가져오고 있습니다. 그런 다음 각 프로젝트에 대해 개별 프로젝트에 대한 데이터를 가져오기 위해 또 다른 API 요청을 수행합니다.

내 API 토큰의 속도가 제한되어 있고 동시에 너무 많은 요청을 하면 제한되기 때문에 각 프로젝트에 동시에 두 번째 API 요청을 할 수 없습니다.

그러나 초기 API 응답 데이터는 여러 페이지로 분할될 수 있으므로 여러 페이지의 데이터를 동시에 처리할 수 있습니다.

몇 가지 조사 끝에 아래 코드는 정확히 내가 원하는 작업을 수행합니다.

으아악

작동 이유를 알고 싶습니다.

으아악

첫 번째 시도는 실패했습니다. 채널에서 wg.Wait() 之后遍历通道,并且我会在结果写入 results결과를 읽을 수 있을 거라고 생각했습니다.

func main() {
    // pretend paginated results from initial API request
    page1 := []int{1, 2, 3}
    page2 := []int{4, 5, 6}
    page3 := []int{7, 8, 9}
    pages := [][]int{page1, page2, page3}

    results := make(chan string)

    var wg sync.WaitGroup
    for i := range pages {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            for j := range pages[i] {
                // simulate making additional API request and building the report
                time.Sleep(500 * time.Millisecond)

                result := fmt.Sprintf("Finished creating report for %d", pages[i][j])
                results <- result
            }

        }(i)
    }

    go func() {
        wg.Wait()
        close(results)
    }()

    for result := range results {
        fmt.Println(result)
    }
}

솔루션

첫 번째 시도:

  1. 메인 고루틴은 3개의 고루틴이 결과 채널에 값을 입력하도록 합니다.
  2. 메인 코루틴은 모든 코루틴이 완료될 때까지 기다립니다.
  3. 고루틴 중 하나는 결과 채널에 값을 넣고 채널을 채웁니다(채널 크기는 1문자열).
  4. 이제 세 개의 고루틴 모두 더 이상 결과 채널에 값을 넣을 수 없으며 결과 채널이 해제될 때까지 절전 모드로 전환됩니다.
  5. 모든 고루틴은 절전 상태입니다. 당신은 막다른 골목에 있습니다.

두 번째 시도에서:

  1. 메인 고루틴에는 4개의 고루틴이 포함되어 있습니다.
  2. 결과 채널에 값을 넣는 3가지 고루틴.
  3. 다른 고루틴(4번째라고 부르겠습니다)은 이 3개의 고루틴이 완료되기를 기다립니다.
  4. 동시에 메인 코루틴은 결과 채널(for 루프)의 값을 기다립니다.
  5. 이 경우 고루틴 중 하나가 결과 채널에 값을 입력하면 나머지 세 개의 고루틴이 차단됩니다. 기본 고루틴은 결과 채널에서 값을 가져와서 다른 고루틴을 차단 해제합니다.
  6. 그래서 3개의 고루틴 모두 각자의 값을 입력하고 종료됩니다
  7. 그 다음 네 번째 고루틴은 채널을 닫습니다
  8. 메인 고루틴은 for 루프를 종료합니다.

위 내용은 sync.WaitGroup 고루틴에 chan 작성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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