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

Select 我可以在不等待goroutine返回的情况下强制终止它吗?,select,concurrency,garbage-collection,go,goroutine,Select,Concurrency,Garbage Collection,Go,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):

让我举一个例子:

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")
  }
}
func WaitForStringOrTimeout()(字符串,错误){
我的频道:=制作(成串)
转到WaitForString(我的频道)
挑选{

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

对于
time
模块的特定情况,没有一个单独的goroutine来处理每个计时器或计时器:相反,计时器由运行时集中管理,这样它就可以知道下次何时需要唤醒

虽然没有goroutine,但该频道和一个小型簿记结构将持续15分钟

如果这是一个问题,考虑使用<代码>时间。NeXTime<代码>代替<代码>时间。在之后,手动返回定时器。

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")
}
t:=time.NewTimer(15*time.min)
推迟停止
挑选{

case found_string:=是,即使输出通道关闭,它也会继续运行。超时检测应该存在于
WaitForString
中,我认为没有办法通过包装来清理goroutine。当然,我可以修改WaitForString(),但这是一个简单的示例。如果第二个案例不是超时,而是WaitForOtherString(),该怎么办?我只需要等到其中一个完成。然后我再次陷入困境,因为我仍然需要“上面”的函数这两种方法都使用select语句。如何停止较慢的goroutine?最终,您需要自己管理中断。请看一下例如。WaitForString()需要注意的是,它可能会被中断,需要有一种机制来中断。也许你也可以使用panic/recover。这就是我所担心的。因此,如果WaitForString接受了一个退出通道,但随后调用了其他可能阻塞的函数,我需要为每个函数创建另一个通道,调用它们在一个包含了你在演示中展示的所有功能的select中,然后告诉他们提前退出。相关的,这是否意味着我无法在go中实现时间模块?例如:我是否可以编写一个goroutine,它以与计时器相同的方式运行,并被代码外部的东西唤醒?你可能会这样做实现类似于
系统调用的功能。选择
:要点是,如果您有两个计时器分别在1秒和2秒内过期,则不需要两个goroutine来唤醒它们:相反,您可以让一个goroutine等待1秒,然后唤醒第一个计时器,然后再等待另一秒来唤醒第二个计时器e、 管理这种数据结构可能会稍微复杂一些,但它是可行的。