当前位置: 首页 > 面试题库 >

去例行阻止其他人

商高谊
2023-03-14
问题内容

以下代码将永远运行,而不是在开始后一秒钟停止。带有无限循环的go例程似乎阻止了另一个例程发送到超时通道。那正常吗?

 func main(){
   timeout:=make(chan int)
   go func(){
      time.SLeep(time.Second)
      timeout<-1
    }()

    res:=make(chan int)
    go func(){
        for{
        }
        res<-1
    }()
    select{
        case<-timeout:
            fmt.Println("timeout")
        case<-res:
            fmt.Println("res")
    }
}

问题答案:

简短的回答:是的。

当前的实现在goroutines之间使用协作调度。这意味着goroutine必须将执行移交给调度程序,以便另一个goroutine运行。将来有希望使用不会有此限制的抢占式调度程序。

发生以下任何一种情况(可能不是完整的列表)时,Goroutine会屈服于调度程序:

  • 无缓冲的陈发送/接收
  • syscalls(包括文件/网络读取和写入)
  • 内存分配
  • time.Sleep()被调用
  • 调用runtime.Gosched()

最后一个允许您在处理器非常密集的循环中手动让步给调度程序。我从来没有发现过需要它的原因,因为我所使用的几乎所有东西都具有足够的通信(通道或系统io),以至于我的程序永远不会卡住。

您可能还会听到GOMAXPROCS,它是对此的解决方案。尽管可以通过将所有goroutine置于不同的线程中来运行它们,但垃圾收集器最终将尝试运行并停止世界。当它停止运行时,不允许运行goroutine,并且如果高cpugoroutine永不屈服,则GC将永远阻止goroutine,但永远不会运行。



 类似资料:
  • 问题内容: 加载页面后,我将对php脚本执行Ajax调用,这将更新服务器。但是,此脚本有时可能需要一分钟才能完成,并且在脚本运行时,我无法执行我需要处理的其他Ajax调用- 即第一个Ajax调用不应中断其他Ajax调用。任何想法如何做到这一点? 首次Ajax通话: 第二个Ajax调用(用户触发的调用): 问题答案: 腺苷的上述评论是正确的。 “在PHP中,一次只能在一个会话上运行一个脚本,以免覆盖

  • 我的问题是,chart js根据数据集上定义的顺序呈现条形图。如下所示,数组索引0处的值为和。由于首先通过了2500,这将阻止1000值的条形图。 https://jsfiddle.net/6bjy9nxh/352/

  • 我正在使用javafx创建一个扫雷克隆,如果有人玩过原始游戏,他们可能会记得当你按下一个磁贴并四处移动时,其他磁贴的行为就好像它们也在被按下一样...如果你放手-即使你最初按下的是一个完全不同的节点,你鼠标当前所在的节点也会被点击。我很难重新创建这个,我需要一些帮助。 我正在使用全局事件处理程序类,我不太确定这是好是坏......但是,让我的克隆的事件单独处理感觉很好。我尝试过在事件发生的节点上使

  • 用粗体写的片段让我感到厌烦。这是否意味着当在一个请求中设置键A的值时,将阻止另一个想要为键B设置值的请求,直到第一个请求完成为止?

  • Eclipse现在有了这个很好的特性,它为您创建了一个名为< code>appcompat_v7的“支持项目”,自动链接两个support-v4 有什么方法可以阻止Eclipse创建额外的克隆吗?

  • 问题内容: 我有一个应用程序,在某些情况下需要计算某些次数。此计算功能具有@Async注释(来自Spring Framework),可以在4个线程上运行这些计算。问题是我需要大约40000个这些计算,并且我想知道所有计算的开始和结束之间的时间,因此我看到在调用计算函数的for循环之前和之后的时间是什么。但是现在所有计算都放入队列中,因此for循环立即完成,时间大约为1秒,而计算要花几个小时才能完成