wzh

wzh

我想有那么一段时光,可以在面朝大海的房车里煮上一杯咖啡,看看曾写过的代码

go 并发相关知识日常总结

本文发布于:2024-09-15

一、并发控制

1、协程 A 在执行过程中需要创建子协程 A1 、A2 .... An ,协程A创建完子协程后就等待子协程退出。针对这种场景,go 提供了 3 种解决方案。

1) Channel:使用 channel 控制子协程。2) WaitGroup: 使用信号量机制控制子协程。3)Context : 使用上下文控制子协程。

1.1 channel 

package main

import (
    "time"
    "fmt"
)

func Process (ch chan int) {
    // do some work
    time.Sleep(tiem.Second)
    ch <- 1 // 在管道中写入一个元素表示当前协程已结束
}

func main() {
    channels  := make([] chan int, 10)
    for i := 0; i < 10; 1++ {
        channels[i] = make(chan int) // 在切片中放入一个 channel
        go Process(channels[i])  // 启动协程,传入一个管道用于通信
    }

    for i, ch := range channels {    // 遍历切片等待子协程结束
        <- ch
        fmt .Println("Routine ", i, " quit!")
    }
}

1.2 WaitGroup

1) Add() 操作必须早于 Wait(), 否则会触发 panic 。2)Add() 设置的值必须与实际等待的 goroutine 的个数一致,否则会触发 panic。

 

 

wzh

wzh

我想有那么一段时光,可以在面朝大海的房车里煮上一杯咖啡,看看曾写过的代码

联络

  • EMail: qihui658[at]qq.com

标签

链接