从函数返回后,让goroutines保持运行状态

时间:2016-05-10 15:11:58

标签: multithreading asynchronous go

在Java中我可以让线程运行很长一段时间,而且我不需要保持在启动线程的函数内。

Goroutines,在我从启动例程的函数返回后,Go对Threads的回答似乎停止了。

如何让这些例程保持运行并从调用函数返回?

由于

2 个答案:

答案 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" } ] } 都将被终止。