英文:
Blocking Behaviour of GoRoutines in Golang
问题
给定以下伪代码:
func main() {
go runFuncOne()
}
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// Do some heavy work
return true
}
runFuncTwo只会对runFuncOne(调用它的goroutine)进行阻塞,还是会对main()进行阻塞,因为它本身并没有作为goroutine运行?
我的假设是main()将打开一个线程,在该线程中runFuncOne()和runFuncTwo()将运行。runFuncTwo()中执行的任何工作将只会阻塞runFuncOne()的这个实例。
英文:
Given the following pseudo-code:
func main() {
go runFuncOne()
}
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// Do some heavy work
return true
}
Would runFuncTwo only be blocking to runFuncOne (the calling goroutine) or would runFuncTwo also block main() as it is not itself running as a goroutine?
My assumption is that main() will open a thread within which runFuncOne() and runFuncTwo() will then operate. Any work performed within runFuncTwo() will then only block this instance of runFuncOne()?
答案1
得分: 4
runFuncTwo只会运行两个代码块中的runFuncOne,因为它们都在单独的Go协程中运行。
但请注意,main()函数会继续执行并退出,导致程序退出。为了避免这种情况并让runFuncTwo完成,你应该使用sync.WaitGroup。
英文:
runFuncTwo blocks runFuncOne only, as both are running in a separate Go routine.
Note though that main() will therefore continue and exit, causing the program to exit. To avoid this and all runFuncTwo to complete, you should use a sync.WaitGroup.
答案2
得分: 1
《Go编程语言规范》
Go语言中的goroutine
在调用的goroutine中,函数值和参数会像平常一样进行评估,但与常规调用不同的是,程序执行不会等待被调用的函数完成。相反,该函数会在一个新的goroutine中独立开始执行。当函数终止时,它的goroutine也会终止。如果函数有返回值,在函数完成时它们会被丢弃。
func main() {
go runFuncOne()
}
main函数会将runFuncOne()作为一个goroutine调用,然后立即退出程序,不等待runFuncOne()完成。
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// 做一些耗时的工作
return true
}
runFuncOne()函数调用runFuncTwo(),因此它会等待runFuncTwo()完成。
英文:
> The Go Programming Language Specification
>
> Go statements
>
> The function value and parameters are evaluated as usual in the
> calling goroutine, but unlike with a regular call, program execution
> does not wait for the invoked function to complete. Instead, the
> function begins executing independently in a new goroutine. When the
> function terminates, its goroutine also terminates. If the function
> has any return values, they are discarded when the function completes.
func main() {
go runFuncOne()
}
main will invoke runFuncOne() as a goroutine and then exit the program immediately, terminating runFuncOne() without waiting for it to complete.
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// Do some heavy work
return true
}
runFuncOne() makes a function call to runFuncTwo() so it will wait for runFuncTwo() to complete.
答案3
得分: 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
}
runFuncOne 的返回类型不重要,如果你在调用它时使用了一个 goroutine。
英文:
Can also use a channel for synchronization:
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
Return type of runFuncOne won't be of consequence if you are calling it with a go routine.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论