golang如何启动一个任务,主任务返回,但是异步任务可以继续运行。最好控制任务的超时时间,比如通过ctx控制。
我的代码是
package main
import (
"fmt"
"time"
)
func asyncTask() {
fmt.Println("task start")
time.Sleep(2 * time.Second)
fmt.Println("task end")
}
func main() {
fmt.Println("main start ")
go asyncTask()
fmt.Println("task...")
time.Sleep(3 * time.Second)
fmt.Println("main end")
}
我希望主要功能不需要睡眠。返回后任务继续运行。
当
main
退出时,程序结束,所有 goroutine 关闭。 main
必须有办法等待所有 goroutine 结束。有多种选择。
最简单的是使用通道。
package main
import (
"fmt"
"time"
)
func worker(done chan bool) {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
done <- true
}
func main() {
done := make(chan bool, 1)
go worker(done)
<-done
}
main 创建一个通道并将其传递给工作人员。
<-done
导致 main 等待,直到有东西可读。一旦worker完成,它会向done通道发送一个真实值(该值无关紧要),main读取它并可以继续。
这无法扩展。对于更多工作人员,请使用 WaitGroups。
package main
import (
"fmt"
"sync"
"time"
)
func worker() {
fmt.Print("working...")
time.Sleep(time.Second)
fmt.Println("done")
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
worker(i)
}()
}
wg.Wait()
}
main 创建一个 sync.WaitGroup。每次启动一个 goroutine 时,它都会向该组添加 1。每个worker都被包装在一个goroutine中,当工作完成时,它会调用
wg.Done
,从组中减去1。 wg.Wait()
将等待,直到 WaitGroup 回到 0,表明所有工作人员都已完成。