go语言并发等待执行完毕(在并发执行中,一个进程要等待)

Go语言的并发特性

Go是一门并发语言,可以同时执行多个任务,从而提高程序的效率。Go语言提供了goroutine和channel两种机制来实现并发操作。

Goroutine是一种轻量级的线程,可以在程序中启动很多个goroutine,每个goroutine可以独立执行一个任务。利用goroutine可以让程序变得非常高效,因为它们可以同时执行多个任务,而且非常节省资源。

Channel是一种通信机制,用于在goroutine之间传递数据。通过channel,不同的goroutine之间可以进行通信和同步,从而协同完成任务。

等待所有goroutine执行完毕

在Go语言中,有时需要等待所有的goroutine执行完毕后再继续执行下一步操作。这时可以使用sync包中的WaitGroup来实现。

WaitGroup是一个可以等待一组goroutine完成的结构。它的原理是在WaitGroup中设置计数器,每个goroutine执行完成后将计数器减1,当计数器变为0时,表示所有goroutine都执行完成了。可以通过Add方法来增加计数器的值,通过Done方法来减少计数器的值,通过Wait方法来等待计数器变为0。

下面是一个使用WaitGroup的示例:

func main() {
    var wg sync.WaitGroup
  
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func(x int) {
           // do something
           wg.Done()
        }(i)
    }
  
    wg.Wait()
    // 所有goroutine都执行完成了
}

使用channel等待goroutine执行结果

在Go语言中,还可以通过channel来等待各个goroutine执行结果。这种方式比较灵活,可以根据实际情况来判断是否继续等待。

实现原理是:每个goroutine执行完后,往一个结果通道中发送通知,主线程在等待所有goroutine执行完成时,不断从结果通道中读取数据,直到所有goroutine都发送了结果。

下面是一个使用channel的示例:

func main() {
    resultCh := make(chan int, 10)
  
    // 启动10个goroutine
    for i := 0; i < 10; i++ {
        go func(x int) {
            // 执行耗时任务
            resultCh <- x
        }(i)
    }
  
    // 读取结果通道
    count := 0
    for r := range resultCh {
        count++
        // 处理结果数据
        // 判断是否所有任务都完成了
        if count == 10 {
            break
        }
    }
}

注意,在使用channel时要特别注意死锁问题。如果goroutine中出现了未关闭的channel,会导致程序死锁。因此,在channel使用完后必须关闭它,以保证程序的正常运行。

本文来自投稿,不代表亲测学习网立场,如若转载,请注明出处:https://www.qince.net/golang-e2xh9.html

郑重声明:

本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,不存在任何商业目的与商业用途。 若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。

我们不承担任何技术及版权问题,且不对任何资源负法律责任。

如遇到资源无法下载,请点击这里失效报错。失效报错提交后记得查看你的留言信息,24小时之内反馈信息。

如有侵犯您的版权,请给我们私信,我们会尽快处理,并诚恳的向你道歉!

(0)
上一篇 2023年5月2日 上午2:46
下一篇 2023年5月2日 上午2:46

猜你喜欢