Goroutines,在我从启动例程的函数返回后,Go对Threads的回答似乎停止了。
如何让这些例程保持运行并从调用函数返回?
由于
答案 0 :(得分:8)
Goroutines 执行在调用它们的函数退出后继续运行:Playground
package main
import (
"fmt"
"time"
)
func countToTen() chan bool {
done := make(chan bool)
go func() {
for i := 0; i < 10; i++ {
time.Sleep(1 * time.Second)
fmt.Println(i)
}
done <- true
}()
return done
}
func main() {
done := countToTen()
fmt.Println("countToTen() exited")
// reading from the 'done' channel will block the main thread
// until there is something to read, which won't happen until
// countToTen()'s goroutine is finished
<-done
}
请注意,我们需要阻止主线程,直到countToTen()
的goroutine完成。如果我们不这样做,主线程将退出,所有其他goroutine将停止,即使他们还没有完成他们的任务。
答案 1 :(得分:0)
你可以。
如果你想让go-routine
永远在后台运行,你需要有某种无限循环,有一些优雅的停止机制,通常是通过通道。并通过其他功能调用go-routine
,因此即使其他功能终止,您的go-routine
仍将继续运行。
例如:
// Go routine which will run indefinitely.
// Unless you send a signal on quit channel.
func goroutine(quit chan bool) {
for {
select {
case <-quit:
fmt.Println("quit")
return
default:
fmt.Println("Do your thing")
}
}
}
// Go routine will still be running,
// after you return from this function.
func invoker() {
q := make(chan bool)
go goroutine(q)
}
此处,您可以在invoker
启动go-routine
时致电invoker
。即使在main
返回后,您的常规例程仍将在后台运行。
唯一的例外是,当go-routines
函数返回时,应用程序中的所有{
"message": "Validation error: Validation notEmpty failed,\nValidation error: Validation isEmail failed",
"errors": [
{
"field": "username",
"message": "Validation notEmpty failed"
},
{
"field": "email",
"message": "Validation isEmail failed"
}
]
}
都将被终止。