gpt4 book ai didi

go - Golang stdin 循环上的 CPU 使用率过高

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

我有一个 golang 应用程序,它需要监听 stdin 上的输入——不是作为命令行实用程序,而是保持运行和监听。以下代码经过稍微编辑后可以运行,但在“空闲”时具有非常高的 CPU 负载 - 我不确定为什么 - 也不清楚如何才能做得更好。所以我需要没有 CPU 负载的相同功能! (这是 ejabberd 的身份验证处理程序的一部分)

bioIn := bufio.NewReader(os.Stdin)
bioOut := bufio.NewWriter(os.Stdout)

var err error
var success bool
var length uint16
var result uint16

for {
binary.Read(bioIn, binary.BigEndian, &length)

buf := make([]byte, length)

r, _ := bioIn.Read(buf)
if r == 0 {
continue
}

if err == nil {
data := strings.Split(string(buf), ":")
// I have code to handle the incoming data here...
} else {
success = false
}

length = 2
binary.Write(bioOut, binary.BigEndian, &length)

if success != true {
result = 0
} else {
result = 1
}

binary.Write(bioOut, binary.BigEndian, &result)
bioOut.Flush()
}

回答:

我按照建议添加了一个短暂的 sleep ,这很有魅力;不需要很长时间,并且对服务提供的身份验证没有明显影响。有了缓冲传入数据的保证,这是完美的解决方案。谢谢大家。

r, _ := bioIn.Read(buf)
if r == 0 {
time.Sleep(25 * time.Millisecond)
continue
}

最佳答案

在这部分代码中:

 r, _ := bioIn.Read(buf)
if r == 0 {
continue
}

您检查返回值 0,这意味着 EOF。即输入流已经结束/终止。一旦 stdin 终止,它就不会再回来了。所以你在这里有一个无限循环。它只会在这个测试中旋转,bioIn.Read() 每次都返回 0。

此时除了退出/退出你真的不能做更多的事情,stdin 没有任何更多的数据给你,永远。

请注意,您的代码还会丢弃从 bioIn.Read() 返回的错误 - 不要那样做,处理错误 - 在这种情况下您会自己发现原因。

关于go - Golang stdin 循环上的 CPU 使用率过高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49540585/

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