golang 如何启动独立于主任务的任务

问题描述 投票:0回答:1

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")
}

我希望主要功能不需要睡眠。返回后任务继续运行。

go asynchronous
1个回答
0
投票

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,表明所有工作人员都已完成。

© www.soinside.com 2019 - 2024. All rights reserved.