这是我参与「第五届青训营 」伴学笔记创作活动的第 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 进行处理。