当前位置: 首页 > article >正文

【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小知识点

💪无人扶我青云志,我自踏雪至山巅。
在这里插入图片描述


http://www.kler.cn/a/387404.html

相关文章:

  • btstack协议栈实战篇--SDP Client - Query Remote SDP Records
  • 全球碳循环数据集(2000-2023)包括总初级生产力、生态系统净碳交换和生态系统呼吸变量
  • SwiftUI开发教程系列 - 第1章:简介与环境配置
  • 一文了解 Tableau 2024.3 如何展现已发布数据源的数据模型
  • 高德地图通过经纬度查找位置和轨迹回放
  • Fortran安装(vscode+gcc+Python)
  • C# 项目中配置并使用 `log4net` 来输出日志
  • ChatGPT的多面手:日常办公、论文写作与深度学习的结合
  • OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用
  • MySQL基础-单表查询
  • 【MySQL】数据库整合攻略 :表操作技巧与详解
  • [编译报错]ImportError: No module named _sqlite3解决办法
  • 任天堂闹钟“Alarmo”已被用户破解 可显示自定义图像
  • Linux环境基础和基础开发工具使用
  • 【知识点总结】 Redis 数据类型操作指令
  • GitHub 和 Gitee 的区别和选择指南
  • 【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
  • js下载excel示例demo
  • Vue keep-alive 深度使用解读
  • 删除conda和 pip 缓存的包
  • 深度剖析RPC框架:为你的分布式应用找到最佳通信方式
  • 每天五分钟深度学习PyTorch:基于全连接神经网络完成手写字体识别
  • 深入Zookeeper节点操作:高级功能与最佳实践
  • IDA*算法 Power Calculus————poj 3134
  • 孔夫子的数字化宝库:用API解锁在售商品的秘密
  • 安装lua-nginx-module实现WAF功能