Go协程学习 | 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

今天主要是看了一些关于协程的一些知识,然后在项目中应用去优化接口,确实能得到很大的速度提升

协程和线程

Go语言中,协程和线程都是用来并发执行任务的工具。但是,它们之间有一些显著的区别:

  • 协程是轻量级的。在同一个进程中,可以创建成千上万个协程,而不会对系统产生太大压力。相比之下,线程更加重量级,系统开启的线程数量受限于系统资源。
  • 协程是由用户程序管理的。在Go语言中,协程的创建、挂起和恢复都是由用户程序来管理的。而线程则是由操作系统管理的。
  • 协程之间通信更简单。在Go语言中,可以使用通道来在协程之间进行通信,这使得通信更加简单。而线程之间的通信则需要使用更加复杂的同步机制,如互斥锁和条件变量。

通道

通道是一种并发编程工具,用于在不同的goroutine之间传递数据,是一种特殊的数据类型

  • 可以通过通道来传递数据,即可以将数据从一个goroutine传递到另一个goroutine。
  • 通道是有类型的,即可以为通道指定传递的数据类型。
  • 通道是双向的,即可以在通道中进行读写操作。
  • 通道是阻塞的,即在通道中读写数据时,如果通道中没有数据可读或没有空间可写,读写操作将会阻塞,直到有数据可读或有空间可写。

样例

通道的创建方式是 make 函数,下面的例子中,使用make函数创建一个整形通道,然后用一个goroutine发送1到通道中,最后从通道中读到这数据

package main

import "fmt"

func main() {
    c := make(chan int)
    go func() {
        c <- 1
    }()
    fmt.Println(<-c)
}


应用

查询了一些资料,有以下的一些应用场景

  • 同步多个 goroutine,在所有 goroutine 完成任务之前阻塞主 goroutine。
  • 实现多个 goroutine 之间的通信。
  • 在多个 goroutine 之间共享数据。
  • 在生产者-消费者模型中使用,生产者往通道里面写数据,消费者从通道里面读数据。
  • 实现负载均衡,将任务分配给不同的 goroutine 进行处理。