gpt4 book ai didi

go - 如何在 Go 中同步可变数量的 channel ?

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:57 24 4
gpt4 key购买 nike

我正在通过编写一个客户端(以 Web 服务器的形式)来测试 Go 中的并发性,该客户端向 Web 服务器发出许多请求,然后返回发出这些请求所花费的时间。基本上是一个基准工具。

这是我目前使用的代码:main.go

我知道我的代码有很多缺陷,但我目前关心的一个问题是,如果我添加更多 go 例程调用,测试性能会发生怎样的变化需要付出多少努力。在 CallSync 函数中,我必须继续添加到这个庞大的 select 语句以及对启动 go 例程的 func 的大量调用列表。我知道一定有更好的方法。我可能甚至不需要像现在这样同步,但如果我这样做了,我怎么能以更灵活的方式做到这一点呢?我想要一个代码,我可以在其中指定要调用的“go routines”的数量,它会调用该例程的次数并与所有关联的 channel 同步,而无需全部硬编码。

最佳答案

就像@JiangYD 建议的那样,只使用一个 channel 更容易:

type resp struct {
id string
i int
}

func Async(url string, c chan<- resp, id string, count int) {
cnt := 0
for i := 0; i < count; i++ {
GetPage(url)
cnt = cnt + 1
if cnt == 50 {
c <- resp{id, i}
cnt = 0
}
}
}

func CallSync(w http.ResponseWriter, r *http.Request) {
t0 := time.Now()
ch := make(chan resp, 20)
for i := range [20]struct{}{} {
go Async("http://localhost:8080/", ch, fmt.Sprintf("ch%02d", i), 2000)
}
count := 0
for count < 4000 {
select {
case r := <-ch:
fmt.Printf("%+v\n", r)
default:
}
}
t1 := time.Now()
diff := t1.Sub(t0)
num := diff.Nanoseconds() / int64(time.Millisecond)
msec := float64(num) / 1000
reqsec := float64(count) / msec
fmt.Fprintf(w, "%v requests\n", count)
fmt.Fprintf(w, "Performed in %v\n", diff)
fmt.Fprintf(w, "At a rate of %v (requests/sec)\n", reqsec)
}

另一种方法是使用 reflect.Select但这只会减慢速度。

关于go - 如何在 Go 中同步可变数量的 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904885/

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