go(基础01)——协程

1. 概念

Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。

2. 协程的优势

1)go协程只需要极少的栈内存(大概4~5KB),默认情况下,线程栈的大小为1MB。

2)go协程也叫用户态线程,协程之间的切换发生在用户态。在用户态没有时钟中断、系统调用等机制,因此效率高。

3)go 协程会复用(Multiplex)数量更少的 OS 线程。即使程序有数以千计的 Go 协程,也可能只有一个线程。如果该线程中的某一 Go 协程发生了阻塞(比如说等待用户输入),那么系统会再创建一个 OS 线程,并把其余 Go 协程都移动到这个新的 OS 线程。这一切都在运行时进行。

4)go 协程使用通道(Channel)来进行通信。信道用于防止多个协程访问共享内存时发生竞态条件(Race Condition)。

3. 单个Go协程

Go 复制代码
package main
 
import (
    "fmt"
)
 
func test() {
    fmt.Println("Hello go")
}
 
func main() {
    go test()
 
    fmt.Println("End")
}

运行结果:

End

结果分析:

1)启动一个新的协程时,协程的调用会立即返回。与函数不同,程序控制不会去等待 Go 协程执行完毕。在调用 Go 协程之后,程序控制会立即返回到代码的下一行,忽略该协程的任何返回值。

2)如果希望运行其他 Go 协程,Go 主协程必须继续运行着。如果 Go 主协程终止,则程序终止,于是其他 Go 协程也不会继续运行。

修改:

Go 复制代码
package main
 
import (
    "fmt"
    "time"
)
 
func test() {
    fmt.Println("Hello go")
}
 
func main() {
    go test()
 
    time.Sleep(1 * time.Second)
    fmt.Println("End")
}

运行结果:

Hello go

End

结果分析:

将主协程休眠1秒,子协程将有足够的足够的时间来执行。

4. 多个Go协程

Go 复制代码
package main
 
import (
    "fmt"
    "time"
)
 
func numbers() {
    for i := 1; i <= 5; i++ {
        time.Sleep(250 * time.Millisecond)
        fmt.Printf("%d ", i)
    }
}
 
func alphabets() {
    for i := 'a'; i <= 'e'; i++ {
        time.Sleep(400 * time.Millisecond)
        fmt.Printf("%c ", i)
    }
}
 
func main() {
    go numbers()
    go alphabets()
    time.Sleep(3000 * time.Millisecond)
    fmt.Println("main terminated")
}

执行结果:

1 a 2 3 b 4 c 5 d e main terminated

一张图解析:

相关推荐
2zcode13 分钟前
基于低光照增强与轻量型CNN道路实时识别算法研究(UI界面+数据集+训练代码)
人工智能·算法·cnn·低光照增强·自动驾驶技术
代码中介商27 分钟前
C++ 仿函数(Functor)深度解析:从基础到应用
开发语言·c++
小雅痞35 分钟前
[Java][Leetcode middle] 209. 长度最小的子数组
java·算法·leetcode
小杍随笔43 分钟前
Rust桌面GUI框架:性能优化与实战避坑指南
开发语言·性能优化·rust
二哈赛车手1 小时前
新人笔记---项目中简易版的RAG检索后评测指标(@Recall ,Mrr..)实现
java·开发语言·笔记·spring·ai
做时间的朋友。1 小时前
精准核酸检测
java·数据结构·算法
格林威1 小时前
3D相机视觉检测:环境光太强,结构光点云全是噪点怎么办?
开发语言·人工智能·数码相机·计算机视觉·3d·视觉检测·工业相机
Rust语言中文社区1 小时前
【Rust日报】2026-05-02 Temper - 用 Rust 编写的 Minecraft 服务器项目发布 0.1.0 版
运维·服务器·开发语言·后端·rust
冯诺依曼的锦鲤1 小时前
从零实现高并发内存池:TCMalloc 核心架构拆解
c++·学习·算法·架构
Thomas_Lee_OR1 小时前
多Agent路径规划 LaCAM for multi-agent path finding (MAPF)
算法·路径规划·仓储机器人·mapf