为了账号安全,请及时绑定邮箱和手机立即绑定

如何按特定顺序运行 2 个 goroutine

如何按特定顺序运行 2 个 goroutine

Go
BIG阳 2022-10-24 15:45:22
我想依次执行 2 个 goroutine,一个接一个。例如,我在 main 函数中调用了以下 goroutine:go func1() go func2()而且我希望 func1() 应该首先完成它的执行,然后只有 func2() 应该执行,每次我运行我的主函数时。如何在 goroutines 中实现这种排序?谢谢。
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

为了确保函数的顺序执行,请在单个 goroutine 中运行函数:

go func() {
    func1()
    func2()
    }()


查看完整回答
反对 回复 2022-10-24
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

如果你真的希望它们作为单独的 goroutines(为什么?)你需要同步它们。您可以使用通道、互斥锁或其他并发原语。下面的示例使用信令通道实现了这一点:


ch := make(chan struct{})

go func() {

  func1()

  close(ch)

}

go func() {

  <-ch

  func2()

}

游乐场:https ://go.dev/play/p/ZqHz-ILpA2J


编辑:按照 Paul Hankin 的建议,使用close(ch)而不是ch <- struct{}{}表示完成。


查看完整回答
反对 回复 2022-10-24
?
心有法竹

TA贡献1866条经验 获得超5个赞

对于顺序运行的 goroutine ,您应该始终使用syncpackage


package main


import (

    "fmt"

    "sync"

)


func main() {


    var w sync.WaitGroup


    w.Add(1)

    go fun1(&w)

    w.Wait()

    

    w.Add(1)

    go  fun2(&w)

    w.Wait()



}


func fun1(w *sync.WaitGroup) {

    i:=1000

    for i>0{

        i-=1

    }

    fmt.Println("fun1")

    defer   w.Done()

}


func fun2(w *sync.WaitGroup) {

    fmt.Println("fun2")

    defer w.Done()


}


查看完整回答
反对 回复 2022-10-24
  • 3 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信