前言
在 Go 语言中,
协程被称为 goroutines。goroutine 是 Go 的并发执行单元,它比传统的线程更轻量级,允许你以非常低的开销启动成千上万个并发任务
通道(channel)是一种特殊的类型,用于在不同的 goroutines 之间进行通信和同步。通道可以被想象成一个传递数据的管道,它可以帮助确保并发程序的数据同步,避免竞态条件
协程
goroutine 在使用上非常简单,只需要在函数调用前加上关键字 go。当 go 关键字用于调用一个函数时,该函数会在一个新的 goroutine 中异步执行
package main
import (
"fmt"
"time"
)
// 这是一个将在goroutine中运行的函数
func sayHello() {
fmt.Println("Hello, World!")
}
func main() {
// 启动一个goroutine
go sayHello()
// 主goroutine需要等待一段时间,否则程序可能在 sayHello goroutine运行之前就退出了
time.Sleep(1 * time.Second)
fmt.Println("Main function finished")
}
sayHello 函数在一个新的 goroutine 中被调用。主 main 函数在调用 sayHello 后会继续执行,几乎立即执行 time.Sleep 来等待一秒钟,确保有足够的时间让 sayHello goroutine 执行。如果没有 time.Sleep,程序可能会在 sayHello goroutine 还没来得及运行时结束,因为主函数(也是一个 goroutine)结束时会关闭所有的其他 goroutines
注意:在实际程序中,我们通常不会使用 time.Sleep 来等待一个 goroutine 完成,因为这种方法并不可靠。相反,我们通常会使用通道(channels)或其他同步机制,如 WaitGroups,来协调不同 goroutines 之间的执行
通道
通道可以是带缓冲的或不带缓冲的
- 不带缓冲的通道在发送和接收数