【go从零单排】初探goroutine
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
Goroutines 是 Go 语言中的一种轻量级线程,用于并发编程。它们允许程序同时执行多个任务,从而提高效率和响应性
通过在函数调用前加上 go 关键字来启动一个新的 goroutine。
💻代码
package main
import (
"fmt"
"time"
)
// 定义函数,循环三次,打印from和:i
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
//调用f函数
f("direct")
//使用 go 关键字调用 f 函数,这会在一个新的 goroutine 中异步执行 f。
//由于是异步执行,主程序不会等待这个 goroutine 完成。
go f("goroutine")
//定义了一个匿名函数,并立即在goroutine调用它,传入字符串 "going"
go func(msg string) {
fmt.Println(msg)
}("going")
//主程序暂停执行 1 秒,以确保有足够的时间让 goroutine 执行完毕。
//如果主程序在 goroutine 完成之前结束,程序将直接退出,导致可能看不到 goroutine 的输出。
time.Sleep(time.Second)//尝试把这行代码注释掉再运行,就会看不到goroutine的打印了
fmt.Println("done")
}
//输出
//direct : 0
//direct : 1
//direct : 2
//going
//goroutine : 0
//goroutine : 1
//goroutine : 2
//done
channel
Goroutines 之间的通信通常使用 通道(channels) 来实现。通道是一种数据结构,用于在 goroutines 之间传递数据,确保数据的安全传递。
ch := make(chan string)
go func() {
ch <- "Hello from goroutine!"
}()
msg := <-ch
fmt.Println(msg)
🔍理解
-
轻量级:创建和销毁 goroutine 的开销非常小。与传统线程相比,goroutines 占用的内存更少,可以在同一地址空间中运行成千上万的 goroutines。
-
调度:Go 运行时会负责调度 goroutines。它会在单个或多个操作系统线程上运行这些 goroutines,自动处理上下文切换。
-
非阻塞:Goroutines 是非阻塞的,这意味着它们可以在等待某些操作(如 I/O 操作)时让出控制权,从而允许其他 goroutines 继续执行
-
Goroutines 是 Go 语言中实现并发的核心特性之一,go和python比起来更快的核心就是它!
💡 Tips小知识点
💪无人扶我青云志,我自踏雪至山巅。