Golang学习笔记_25——协程
Golang学习笔记_22——Reader示例
Golang学习笔记_23——error补充
Golang学习笔记_24——泛型
文章目录
- 协程
- 1. 协程的创建
- 2. 特性
- 3. 声明周期
- 源码
协程
Golang(也称为Go语言)中的协程(Goroutine)是一种轻量级的线程,由Go运行时管理。
它们提供了一种高效的方式来并发执行任务。在Go中,协程是非常轻量级的,创建和销毁它们的开销非常小,这使得在Go程序中大量使用协程成为可能。
1. 协程的创建
在Go中,你可以通过go关键字来创建一个新的协程。
go关键字后面跟的是一个函数调用。当Go运行时遇到go关键字时,它会在一个新的协程中异步执行该函数调用。
func goroutineFunc() {
fmt.Println("goroutine func")
}
func goroutineDemo() {
go goroutineFunc()
time.Sleep(1 * time.Second)
}
测试方法
func Test_goroutineDemo(t *testing.T) {
goroutineDemo()
}
输出结果
=== RUN Test_goroutineDemo
goroutine func
--- PASS: Test_goroutineDemo (1.00s)
PASS
2. 特性
- 轻量级:协程的创建和切换开销非常小,可以在一个程序中创建大量协程。
- 自动调度:协程由Go运行时自动调度,开发者不需要手动管理线程的创建和销毁。
- 共享内存:协程之间可以共享相同的地址空间,简化了内存管理和数据共享。
- 非阻塞:协程之间的通信和同步是非阻塞的,避免了传统线程中的锁竞争问题。
3. 声明周期
- 等待协程完成:在多协程场景中,主程序通常需要等待所有协程完成后再退出。Go提供了sync.WaitGroup工具来等待一组协程完成。
- 取消协程执行:在某些情况下,我们可能需要提前取消协程的执行。Go的context包提供了上下文管理功能,允许在协程之间传递取消信号。
源码
// goroutine.go 文件
package goroutine_demo
import (
"fmt"
"time"
)
func goroutineFunc() {
fmt.Println("goroutine func")
}
func goroutineDemo() {
go goroutineFunc()
time.Sleep(1 * time.Second)
}
// goroutine_test.go 文件
package goroutine_demo
import "testing"
func Test_goroutineDemo(t *testing.T) {
goroutineDemo()
}