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) } }
첫 번째 시도:
두 번째 시도에서:
위 내용은 sync.WaitGroup 고루틴에 chan 작성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!