gpt4 book ai didi

Golang 异步和 CPU 使用率

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

我正在学习 Go 并发,我的期望是使用 goroutines 和 channel 应该增加并发。该程序需要几毫秒才能完成。但是随着负载的增加,执行时间不断增加,尽管有大量 CPU 空闲。

我正在向下面的程序发送 1200 QPS/TPS 以分析请求到响应时间,我发现程序的整体执行时间随着时间的推移而增加。此外,CPU 使用率约为 3-6%。

当我将 QPS 增加到 100,000 时,程序的执行时间增加到秒(从最初的毫秒)。但 CPU 使用率保持在 8-9%。

那么为什么程序不使用其他 90-94% 的可用 CPU 并更快地完成程序的执行?

ulimit -n 为 2000000。

package main

import (
"fmt"
"github.com/valyala/fasthttp"
"strings"
"sync"
)

func total(in chan int, out chan int) {
res := 0
for iter := range in {
res += iter
}
out <- res // sends back the result
}

func check() {

ch := make(chan int)
rch := make(chan int)
go total(ch, rch)
ch <- 1
ch <- 2
ch <- 3
close(ch) // this will end the loop in the total function
result := <-rch // waits for total to give the result
fmt.Println("Total is ", result)
}

func main() {
var wg sync.WaitGroup
wg.Add(1)

go func() {
m := func(ctx *fasthttp.RequestCtx) {

maingetpath := ctx.Path()
urlPart := strings.Split(string(maingetpath), "/")
func := urlPart[1]
switch string(func) {
case "white":
check()
default:
ctx.Error("not found", fasthttp.StatusNotFound)
}
}

fasthttp.ListenAndServe(":8080", m)
defer wg.Done()
}()

wg.Wait()
}

最佳答案

我不确定您要在这个小服务器上做什么。

1) 您正在创建一个 WaitGroup 并将其加 1,调用一个匿名 go 例程,并在 main 中等待,这什么都不做,然后将您的 main 移至匿名函数。

2) 让我们看看您在 checktotal 函数中做了什么:

func total(in chan int, out chan int) {
res := 0
// this will just pull the value, and then wait till the next value
// is pushed... till you close the "in" channel
for iter := range in {
res += iter
}
out <- res // sends back the result
}

func check() {

ch := make(chan int)
rch := make(chan int)
go total(ch, rch)
// we are pushing this value into a unbuffered channel...
ch <- 1 // this gets pushed and waits until it is pulled in the total function
ch <- 2 // this gets pushed and waits until it is pulled in the total function
ch <- 3 // this gets pushed and waits until it is pulled in the total function
close(ch) // this will end the loop in the total function
result := <-rch // waits for total to give the result
fmt.Println("Total is ", result)
}

请帮助我理解当完全同步时这将如何使用任何并发?

也许如果你把对 check 的调用放在一个 go 例程中,它会更有效率一点,但对我来说仍然真的没有意义。

关于Golang 异步和 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49846247/

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