golang协程顺序执行

发布时间:2024-12-23 00:28:16

协程(goroutine)是Go语言中的一种轻量级线程实现机制,它可以让开发者在程序中以非阻塞的方式执行并发任务,提高程序的性能和并发能力。本文将介绍如何使用Golang的协程来顺序执行并发任务。

创建并运行协程

在Go语言中,可以通过关键字go来创建协程并执行任务。例如:

func main() {
    go task()
    fmt.Println("Main Goroutine")
}

func task() {
    fmt.Println("Task Goroutine")
}

上述代码中,通过go关键字创建了一个协程来执行task函数。可以看到,在主协程中调用task函数后,会立即返回到主协程,并在终端打印"Main Goroutine"。同时,task函数也被创建为一个新的协程并在终端打印"Task Goroutine"。可以看出,在Go语言中同时存在多个协程,它们可以并发地执行不同的任务。

协程间的通信

在实际的并发编程中,协程之间的通信很重要。Go语言提供了内置的通道(Channel)机制,可以用于协程之间的数据传递和同步。例如:

func main() {
    ch := make(chan int)

    go task(ch)
    data := <-ch
    fmt.Printf("Received data: %d\n", data)
}

func task(ch chan int) {
    ch <- 10
}

上述代码中,通过make关键字创建了一个int类型的通道ch,并在main协程中调用了task函数。在task函数中,使用<-运算符将值10发送到通道ch中。而在main协程中,通过<-运算符接收通道ch中的值,并打印在终端上。可以看到,通过通道可以实现协程之间的数据传递和同步。

等待协程的完成

在实际的并发编程中,有时候需要等待所有协程完成后再继续执行其他任务。Go语言提供了sync包中的WaitGroup类型,用于等待一组协程的完成。例如:

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go task(&wg)
    go task(&wg)
    wg.Wait()

    fmt.Println("All goroutines finished.")
}

func task(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("Task goroutine")
}

上述代码中,通过sync包导入了WaitGroup类型,并在主协程中使用Add方法设定等待的协程数量为2。在task函数中,通过defer关键字在协程完成之后调用了Done方法。在主协程中,在所有协程执行完毕之前调用了Wait方法,该方法会一直阻塞,直到等待的协程数量变为0。最后,在终端上打印"All goroutines finished."。

通过以上方式,我们可以方便地等待一组协程的完成,进而在所有协程都结束后执行其他任务。

相关推荐