gpt4 book ai didi

select - 我可以在不等待 goroutine 返回的情况下强制终止它吗?

转载 作者:IT王子 更新时间:2023-10-29 01:28:06 26 4
gpt4 key购买 nike

举个例子:

func WaitForStringOrTimeout() (string, error) {
my_channel := make(chan string)
go WaitForString(my_channel)

select {
case found_string := <-my_channel:
return found_string, nil
case <-time.After(15 * time.Minute):
return nil, errors.New("Timed out waiting for string")
}
}

在这个简单的例子中,我有一些 WaitForString 函数,它会阻塞一段时间并最终可能返回一个字符串。我想用这段代码包装 WaitForString,它要么返回相同的字符串,要么因错误而超时。

如果快速找到一个字符串,是否仍然有一个 goroutine 在某处运行 15 分钟的 sleep 语句,或者这个垃圾是否以某种方式被收集了?

如果发生超时并且从未找到字符串,是否还有运行 WaitForString 的 goroutine,即使没有其他例程可以观察到它的输出?如果 WaitForString 分配了大量内存但从未返回怎么办?

有什么方法可以让 WaitForString() 意识到发生超时并放弃吗?

最佳答案

一般来说,没有办法停止另一个 goroutine。有一个 runtime.Goexit可用于导致当前 goroutine 退出的函数(即使从深度调用框架调用),但不会导致其他 goroutine 退出。

对于 time 模块的特定情况,没有单独的 goroutine 来处理每个计时器或自动收报机:相反,计时器由运行时集中管理,因此它可以判断下一次需要什么时候醒来。

虽然没有 goroutine 挂起,但 channel 和一个小的簿记结构将保留 15 分钟。

如果这是一个问题,请考虑使用 time.NewTimer 而不是 time.After,并在返回时手动停止计时器。例如:

t := time.NewTimer(15 * time.Minute)
defer t.Stop()
select {
case found_string := <-my_channel:
return found_string, nil
case <-t.C:
return nil, errors.New("Timed out waiting for string")
}

time.After 对于精确的周期性行为非常有用,而 time.NewTimer 对于简单的超时非常有用。

关于select - 我可以在不等待 goroutine 返回的情况下强制终止它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842963/

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