首页  >  文章  >  后端开发  >  golang函数与goroutine的通信方式

golang函数与goroutine的通信方式

PHPz
PHPz原创
2024-04-26 09:36:02949浏览

函数和 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 并行处理任务可以显著提高程序的执行效率,特别是对于计算密集型任务。

以上是golang函数与goroutine的通信方式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn