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



让我举个例子:

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,它要么返回相同的字符串,要么超时并出现错误。

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

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

有没有办法让 WaitForString() 意识到发生的超时并放弃?

一般来说,没有办法阻止另一个goroutine。 有一个 runtime.Goexit 函数可用于导致当前 goroutine 退出(即使从深度调用帧调用),但没有任何东西会导致其他 goroutines 退出。

对于time模块的特定情况,没有单独的goroutine处理每个计时器或股票代码:相反,计时器由运行时集中管理,因此它可以知道下一次需要唤醒的时间。

虽然没有闲逛,但频道和一个小的簿记结构将持续 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对于简单的超时则很好用。

最新更新