最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • golang函数与goroutine的通信方式

    函数和 goroutine 之间可以通过以下方式通信:互斥锁:用于保护共享资源条件变量:用于通知满足条件的 goroutine通道:数据传输缓冲区原子变量:无锁并发访问变量实战案例:并行处理任务,通过 goroutine 提高计算密集型任务的执行效率,具体包括创建任务、启动 goroutine 处理任务、收集处理结果三个步骤。

    golang函数与goroutine的通信方式

    Go 语言中函数和 Goroutine 之间的通信方式

    在 Go 语言中,函数和 Goroutine 可以通过以下几种方式进行通信:

    1. 互斥锁(Mutex)

    互斥锁用于保护共享资源,确保同一时间只有一个 Goroutine 能够访问该资源。

    var mu sync.Mutex // 全局互斥锁
    
    func increment(i *int) {
        mu.Lock()
        *i++
        mu.Unlock()
    }

    2. 条件变量(Cond)

    条件变量用于在指定条件满足时通知等待的 Goroutine。

    var cond sync.Cond // 全局条件变量
    
    func wait(c *sync.Cond, i *int) {
        c.L.Lock()
        for {
            if *i == 0 {
                c.Wait()
            }
            break
        }
        c.L.Unlock()
    }

    3. 通道(Channel)

    通道是一个用来在 Goroutine 之间发送数据的缓冲区。

    var ch = make(chan int, 10) // 创建容量为 10 的通道
    
    func send(c chan int, i int) {
        c <- i // 发送数据
    }
    
    func receive(c chan int) {
        v := <-c // 接收数据
    }

    4. 原子变量

    原子变量可以在没有锁的情况下进行并发访问。

    var atomicInt int64
    
    func incrementAtomic(i *int64) {
        atomicInt++
    }

    实战案例:并行处理任务

    下面是一个使用 Goroutine 并行处理任务的实战案例:

    // 任务类型
    type Task struct {
        Num  int
        Chan chan int
    }
    
    func processTask(t *Task) {
        // 处理任务并返回结果
        result := t.Num * t.Num
        t.Chan <- result
    }
    
    func createTasks(n int) []*Task {
        // 创建 n 个任务
        tasks := make([]*Task, n)
        for i := 0; i < n; i++ {
            tasks[i] = &Task{
                Num:  i,
                Chan: make(chan int),
            }
        }
        return tasks
    }
    
    func main() {
        n := 10
        tasks := createTasks(n)
    
        // 启动 n 个 Goroutine 并行处理任务
        for _, t := range tasks {
            go processTask(t)
        }
    
        // 从任务中收集处理结果
        results := make([]int, n)
        for i := 0; i < n; i++ {
            results[i] = <-tasks[i].Chan
        }
    
        // 打印结果
        for _, r := range results {
            fmt.Println(r)
        }
    }

    使用 Goroutine 并行处理任务可以显著提高程序的执行效率,特别是对于计算密集型任务。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » golang函数与goroutine的通信方式
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 292稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情