【问题标题】:Blocking Behaviour of GoRoutines in GolangGolang 中 GoRoutine 的阻塞行为
【发布时间】:2017-09-03 04:06:00
【问题描述】:

给定以下伪代码:

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() 的这个实例?

【问题讨论】:

    标签: function go concurrency goroutine


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了,说得通 - 谢谢。
    【解决方案2】:

    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() 完成。

    【讨论】:

    • 太棒了,有道理 - 谢谢。
    【解决方案3】:

    也可以使用通道进行同步:

    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

    如果您使用 go 例程调用它,runFuncOne 的返回类型将不会产生影响。

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2020-03-18
      • 2016-07-06
      • 1970-01-01
      • 2021-12-09
      • 2017-07-14
      • 2020-10-12
      • 2019-11-04
      • 2020-04-03
      相关资源
      最近更新 更多