在Golang中阻止GoRoutines的行为

时间:2017-09-03 04:06:00

标签: function go concurrency goroutine

给出以下伪代码:

func main() {
  go runFuncOne()
}

func runFuncOne() bool {
  runFuncTwo() 
  return true
}

func runFuncTwo() bool {
  // Do some heavy work
  return true
}

runFuncTwo只会阻止runFuncOne(调用goroutine)或runFuncTwo阻止main()因为它本身不是作为goroutine运行的吗?

我的假设是,main()会打开一个帖子,runFuncOne()runFuncTwo()将在其中运行。在runFuncTwo()内执行的任何工作都只会阻止此runFuncOne()的实例?

3 个答案:

答案 0 :(得分:1)

runFuncTwo仅阻止runFuncOne,因为它们都在单独的Go例程中运行。

请注意,main()因此会继续并退出,导致程序退出。要避免这种情况并完成所有runFuncTwo,您应该使用sync.WaitGroup。

答案 1 :(得分:1)

  

The Go Programming Language Specification

     

Go statements

     

功能值和参数按照常规进行评估   调用goroutine,但不像常规调用,程序执行   不等待调用的函数完成。相反,   函数在新的goroutine中独立开始执行。当。。。的时候   函数终止,其goroutine也终止。如果功能   有任何返回值,它们在函数完成时被丢弃。

func main() {
  go runFuncOne()
}

main将调用runFuncOne()作为goroutine,然后立即退出程序,终止runFuncOne()而不等待它完成。

func runFuncOne() bool {
  runFuncTwo() 
  return true
}

func runFuncTwo() bool {
  // Do some heavy work
  return true
}

runFuncOne()runFuncTwo()进行函数调用,以便等待runFuncTwo()完成。

答案 2 :(得分:1)

还可以使用频道进行同步:

package main

import (
    "fmt"
    "time"
)

func main() {
    var ch chan int = make(chan int)
    go runFuncOne(ch)
    fmt.Println("Waiting..")
    fmt.Println(<-ch)
}

func runFuncOne(ch chan int) {
    runFuncTwo(ch)
    ch <- 1
}

func runFuncTwo(ch chan int) bool {
    time.Sleep(1 * time.Second)
    fmt.Println("Done working..")
    return true
}

https://play.golang.org/p/h1S4TSdT0w

runFuncOne的返回类型如果您通过go例程调用它将不会产生后果。