登录
首页 >  Golang >  Go教程

Golang 函数中 goroutine 之间如何通信?

时间:2024-10-27 10:34:43 346浏览 收藏

大家好,今天本人给大家带来文章《Golang 函数中 goroutine 之间如何通信?》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

Goroutine 之间通信的方法包括:通道:用于安全传输数据值,允许一个 goroutine 发送数据,另一个 goroutine 接收数据。原子变量:可并发读写的变量,无需锁,适合维护共享状态。等待组:用于管理一组并行 goroutine,允许等待所有 goroutine 完成后再继续执行。

Golang 函数中 goroutine 之间如何通信?

Go 函数中 goroutine 之间的通信

Go 中的 goroutine 是一种轻量级线程,允许您并发执行代码。goroutine 之间需要通信以交换数据或协调任务。Go 提供了多种机制来实现 goroutine 之间的通信。

通道

通道是一种在 goroutine 之间安全传输数据的值类型。它们允许一个 goroutine 将数据发送到通道,而另一个 goroutine 可以从通道接收数据。

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个通道
    ch := make(chan int)

    // 启动一个 goroutine 发送数据到通道
    go func() {
        ch <- 42 // 发送数据到通道
    }()

    // 启动一个 goroutine 从通道接收数据
    go func() {
        value := <-ch // 从通道接收数据
        fmt.Println(value)
    }()

    time.Sleep(500 * time.Millisecond) // 等待 goroutine 运行
}

原子变量

原子变量是可以并发读写而无需锁的变量。它们对于维护共享状态非常有用。

package main

import (
    "fmt"
    "runtime"
    "sync/atomic"
)

func main() {
    // 创建一个原子变量
    var counter int64

    // 启动多个 goroutine 并发增加计数器
    for i := 0; i < runtime.NumCPU(); i++ {
        go func() {
            for j := 0; j < 1000; j++ {
                atomic.AddInt64(&counter, 1) // 并发增加计数器
            }
        }()
    }

    time.Sleep(500 * time.Millisecond) // 等待 goroutine 运行

    fmt.Println(counter) // 打印最终计数
}

等待组

等待组是一个用于管理一组并行执行的 goroutine 的机制。它允许您等待所有 goroutine 完成后再继续执行。

package main

import (
    "fmt"
    "sync"
)

func main() {
    // 创建一个等待组
    var wg sync.WaitGroup

    // 启动多个 goroutine
    for i := 0; i < 10; i++ {
        wg.Add(1) // 增加等待组计数器

        go func(i int) {
            defer wg.Done() // 减少等待组计数器
            fmt.Println(i)
        }(i)
    }

    // 等待所有 goroutine 完成
    wg.Wait()

    fmt.Println("所有 goroutine 已完成")
}

本篇关于《Golang 函数中 goroutine 之间如何通信?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>