登录
首页 >  Golang >  Go问答

在golang中,代码是否会覆盖已经运行的进程?

来源:stackoverflow

时间:2024-02-28 13:27:25 401浏览 收藏

golang学习网今天将给大家带来《在golang中,代码是否会覆盖已经运行的进程?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

例如,如果我有类似的内容:

t := time.NewTicker(time.Second*1)
for {
  select {
   case <-t.C:
     runSomeExpensiveFunction() // takes over 1 second
  }
  // ...
}

假设 runsomeexpectivefunction 循环打印 1 到 1 万亿的数字。

runsomeexpectivefunction 是否保证完成运行,还是 golang 会杀死它并在每次收到新的报价时再次运行它?

我已经做了一些手动测试,似乎 golang 会等待此函数完成,然后再进入下一个刻度,但这对我来说感觉不对。


正确答案


首先,go 永远不会杀死一个 go 例程。 runsomeexpectivefunction 将运行直至完成。

其次,根据我们在此处看到的代码,一次只能运行一个 runsomeexpectivefunction。将此视为“每次收到新的蜱虫”是不正确的,因为没有任何东西“接收”蜱虫。您的select执行一个分支,然后完成,是for {} {} ction返回。

您的 select 将调用 runsomeexpectivefunction,执行流程将进入该函数,并且 select 完成。计时器可能会通过其通道发出下一个滴答声,但没有任何东西在监听它。只有当您的函数返回时,执行流程才会到达 for { } 的末尾并返回到顶部,在那里它再次遇到 select,并测试从计时器通道读取的 case

如果您希望同时运行多个函数调用,则可以使用 go 关键字:

case <-t.C:
     go runSomeExpensiveFunction()

您应该注意,如果该函数花费超过一秒,您将看到无限的并行性,并且您的程序最终将崩溃。

到这里,我们也就讲完了《在golang中,代码是否会覆盖已经运行的进程?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>