gpt4 book ai didi

go - 非阻塞 readline 挂起时泄漏 goroutine

转载 作者:IT王子 更新时间:2023-10-29 02:33:52 25 4
gpt4 key购买 nike

假设您有这样的结构:

ch := make(chan string)
errCh := make(chan error)
go func() {
line, _, err := bufio.NewReader(r).ReadLine()
if err != nil {
errCh <- err
} else {
ch <- string(line)
}
}()
select {
case err := <-errCh:
return "", err
case line := <-ch:
return line, nil
case <-time.After(5 * time.Second):
return "", TimeoutError
}

在 5 秒超时的情况下,goroutine 挂起直到 ReadLine 返回,这可能永远不会发生。我的项目是一个长期运行的服务器,所以我不想堆积卡住的 goroutines。

最佳答案

在进程退出或方法读取一行之前,ReadLine 不会返回。管道没有截止日期或超时机制。

如果对 ReadLine 的调用在超时后返回,goroutine 将阻塞。这可以通过使用缓冲 channel 来解决:

ch := make(chan string, 1)
errCh := make(chan error, 1)

应用程序应调用 Wait清理与命令关联的资源。 goroutine 是调用它的好地方:

go func() {
line, _, err := bufio.NewReader(r).ReadLine()
if err != nil {
errCh <- err
} else {
ch <- string(line)
}
cmd.Wait() // <-- add this line
}()

这将导致 goroutine 阻塞,而这正是您要避免的事情。另一种方法是应用程序泄漏每个命令的资源。

关于go - 非阻塞 readline 挂起时泄漏 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32685442/

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