作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在通过编写一个客户端(以 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/
我是一名优秀的程序员,十分优秀!