gpt4 book ai didi

go - 有没有更好的方法来跟踪 goroutine 响应?

转载 作者:IT王子 更新时间:2023-10-29 01:23:54 26 4
gpt4 key购买 nike

我正在努力了解 goroutines。我创建了一个简单的程序,可以跨多个搜索引擎并行执行相同的搜索。目前,为了跟踪回复数量,我统计了收到的回复数量。虽然看起来有点业余。

是否有更好的方法来了解我何时收到以下代码中所有 goroutine 的响应?

package main

import (
"fmt"
"net/http"
"log"
)

type Query struct {
url string
status string
}

func search (url string, out chan Query) {
fmt.Printf("Fetching URL %s\n", url)
resp, err := http.Get(url)

if err != nil {
log.Fatal(err)
}

defer resp.Body.Close()

out <- Query{url, resp.Status}
}

func main() {
searchTerm := "carrot"

fmt.Println("Hello world! Searching for ", searchTerm)

searchEngines := []string{
"http://www.bing.co.uk/?q=",
"http://www.google.co.uk/?q=",
"http://www.yahoo.co.uk/?q="}

out := make(chan Query)

for i := 0; i < len(searchEngines); i++ {
go search(searchEngines[i] + searchTerm, out)
}

progress := 0

for {
// is there a better way of doing this step?
if progress >= len(searchEngines) {
break
}
fmt.Println("Polling...")
query := <-out
fmt.Printf("Status from %s was %s\n", query.url, query.status)
progress++
}
}

最佳答案

请使用sync.WaitGrouppkg doc中有一个例子

searchEngines := []string{
"http://www.bing.co.uk/?q=",
"http://www.google.co.uk/?q=",
"http://www.yahoo.co.uk/?q="}
var wg sync.WaitGroup
out := make(chan Query)

for i := 0; i < len(searchEngines); i++ {
wg.Add(1)
go func (url string) {
defer wg.Done()
fmt.Printf("Fetching URL %s\n", url)
resp, err := http.Get(url)

if err != nil {
log.Fatal(err)
}

defer resp.Body.Close()

out <- Query{url, resp.Status}

}(searchEngines[i] + searchTerm)

}
wg.Wait()

关于go - 有没有更好的方法来跟踪 goroutine 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15038834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com