Go 协程(Goroutine)入门与基础使用

一、什么是协程(Goroutine)?

简单来说,协程是由 Go 语言运行时管理的轻量级线程。相比系统线程,它的调度开销极小,内存占用非常少(默认只需 2KB 栈空间)。

你可以在一个程序中轻松创建成千上万个 goroutine,而不会像传统线程那样造成系统负担。

二、如何创建一个协程

只需要在函数调用前加上 go 关键字,Go 就会在新的协程中异步执行该函数:

package mainimport ("fmt""time"
)func sayHello() {fmt.Println("Hello from goroutine")
}func main() {go sayHello() // 启动一个新的协程time.Sleep(1 * time.Second) // 给协程执行的时间
}

如果不加 time.Sleep主线程可能直接退出,协程还没执行完,即不会输出"Hello from goroutine"。

三、多个协程并发执行

我们可以轻松开启多个任务同时运行:

package mainimport ("fmt""time"
)func main() {for i := 0; i < 5; i++ {go func(i int) {fmt.Printf("Worker %d is running\n", i)}(i)}time.Sleep(1 * time.Second)
}

输出顺序是不确定的,因为每个协程的调度是由 Go 运行时决定的。

四、协程与主线程的关系

主函数是 Go 程序的入口,也是主协程。一旦 main() 执行完毕,程序就退出,即使其他协程还在执行

为了解决这个问题,我们常用 sync.WaitGroup 等机制来等待所有协程结束:

package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc worker(id int) {defer wg.Done()fmt.Printf("Worker %d done\n", id)
}func main() {for i := 1; i <= 3; i++ {wg.Add(1)go worker(i)}wg.Wait() // 等待所有 goroutine 完成
}

五、goroutine 的注意事项

闭包中的变量捕获问题

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func() {time.Sleep(time.Second)fmt.Println(i)wg.Done()}()}wg.Wait() // 等待所有 goroutine 完成
}

正确做法是将变量作为参数传进去:

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func(val int) {time.Sleep(time.Second)fmt.Println(val)wg.Done()}(i)}wg.Wait() // 等待所有 goroutine 完成
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 各种智能优化算法

1. 优化算法相关 蚁群优化算法&#xff08;ACO&#xff09; 蚁群优化算法是一种模拟蚂蚁觅食行为的优化技术。以下是一个简化版的ACO用于解决旅行商问题&#xff08;TSP&#xff09;的MATLAB代码&#xff1a; function [bestRoute, minDist] acoTsp(distMatrix, numAnts, n…

Hilt -> Android 专属依赖注入(DI)框架

Hilt 是 Google 基于 Dagger 封装的 Android 专属依赖注入&#xff08;DI&#xff09;框架&#xff0c;显著简化了依赖管理流程&#xff0c;提升代码可维护性和可测试性。以下是核心要点及使用指南&#xff1a; dagger2: Dagger 2 原理和使用-CSDN博客 Hilt vs Dagger2&…

AISHELL-5 全球首套智能驾舱中文语音交互数据集开源

随着汽车成为人们日常生活中不可或缺的一部分&#xff0c;而驾驶舱中传统的触摸交互方式容易分散驾驶员的注意力&#xff0c;存在安全风险&#xff0c;因此&#xff0c;车内基于语音的交互方式得到重视。与通常家庭或会议场景中的语音识别系统不同&#xff0c;驾驶场景中的系统…

openstack之neutron(一)

NFV基础 neutron是对二层物理网络的抽象与管理&#xff0c;实例的网络功能由连接到vSwitch的端口上的vNIC共同实现&#xff0c;再通过物理服务器的物理网卡访问外部的物理网络。 NFV实现 网卡虚拟化&#xff1a;tap、tun、veth&#xff1b; 交换机虚拟化&#xff1a;linuxbri…

【Java】Arrays.sort:TimSort

一&#xff0c;概述 书接前文【Java】Arrays.sort:DualPivotQuicksort-CSDN博客 Arrays.sort对基本数据类型使用了双轴快速排序&#xff0c;但是对Object[]类型&#xff0c;则使用了TimSort&#xff0c;TimSort是稳定的排序&#xff0c;它整合了插入排序归并排序&#xff0c;…

一个n8n构建的能和LLM对话的Agent

一个n8n构建的能和LLM对话的Agent 1.OLLAMA1.1.下载和安装1.2.设置环境变量1.3.重启ollama1.4.测试1.5.拉取模型2.n8n部署2.1. 镜像拉取和启动2.2.注册和登录2.3.新建一个工作流3.说在后面的话环境搭建说明: windows(RTX 5090)+VM CENTOS 采用本地化的ollama运行LLM n8n是一…

升级 Ubuntu Linux 内核的几种不同方法

方法 &#xff11; &#xff0d; 使用 dpkg 升级 Linux 内核&#xff08;手动方式&#xff09; 这个方法可以帮助你从 kernel.ubuntu.com 网站手动下载可用的最新 Linux 内核。如果你打算安装最新版&#xff08;而不是稳定版或者正式发布版&#xff09;&#xff0c;那这种方法…

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…

Linux 内核 Slab 分配器核心组件详解

Slab 分配器是 Linux 内核中用于高效管理内存的机制&#xff0c;其核心目标是通过对象缓存减少内存碎片和分配/释放开销。以下详细解析其核心组件及其协作关系&#xff1a; 一、Slab 系统的核心组件 组件 描述 作用场景 Slab 描述符 每个 Slab 的管理结构&#xff08;如 struc…

Oracle 的AHF (Automatic Health Framework) 工具

Oracle 的AHF (Automatic Health Framework) 工具 Oracle AHF (Automatic Health Framework) 是 Oracle 官方提供的诊断工具集合&#xff0c;用于自动收集、分析和诊断 Oracle 数据库及集群环境的健康状态和问题。 一 AHF 核心功能概述 1. 主要组件 TFA (Trace File Analyz…

华为服务器obsutil使用方法

本文不生产技术&#xff0c;只做技术的搬运工&#xff01;&#xff01;&#xff01; 前言 最近在使用华为云服务器进行模型训练&#xff0c;发现其上传下载文件都极慢&#xff0c;询问华为官方人员是否限速&#xff0c;对方推荐使用obsutil作为中转服务进行下载&#xff0c;在…

【大模型训练】中短序列attention 和MOE层并行方式(二)

我们考虑一个典型的Transformer模型结构&#xff0c;在多层堆叠中&#xff0c;其中包含Attention层和MoE层&#xff08;FeedForward层被替换为MoE层&#xff09;。在模型最后是LM Head&#xff08;语言模型头&#xff09;&#xff0c;通常是一个全连接层&#xff0c;将隐层向量…

2025-06-09(批量智能裁剪视频尺寸并延长视频时长)

import os import subprocess import random import json # 配置参数 TARGET_WIDTH 500 TARGET_HEIGHT 600 TARGET_DURATION 180 # 目标时长&#xff08;秒&#xff09; OUTPUT_DIR "processed_videos" MIRROR_MODES ["none", "horizontal&quo…

CKA考试知识点分享(9)---gateway api

CKA 版本&#xff1a;1.32 第九套题是涉及gateway api相关。 注意&#xff1a;本文不是题目&#xff0c;只是为了学习相关知识点做的实验。仅供参考 实验目的 创建一个gateway api&#xff0c;来实现后端镜像的外部访问。 gateway api 通过nginx实现 实验开始 安装nginx ga…

Kafka 消息模式实战:从简单队列到流处理(一)

一、Kafka 简介 ** Kafka 是一种分布式的、基于发布 / 订阅的消息系统&#xff0c;由 LinkedIn 公司开发&#xff0c;并于 2011 年开源&#xff0c;后来成为 Apache 基金会的顶级项目。它最初的设计目标是处理 LinkedIn 公司的海量数据&#xff0c;如用户活动跟踪、消息传递和…

Linux中使用yum安装MYSQL

1、关系型数据库 MySQL 使用 yum 安装mysql 1、检查是否已经安装 Mysql rpm -qa | grep mysql如果安装了 就进行卸载 rpm -e mysql-community-libs-5.7.44-1.el7.x86_64 rpm -e mysql57-community-release-el7-11.noarch rpm -e mysql-community-common-5.7.44-1.el7.x86_64…

Linux 文件系统与 I/O 编程核心原理及实践笔记

文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度&#xff1a;进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…

1.9 Express

Express 是一个基于 Node.js 平台的轻量级、灵活的 Web 应用框架&#xff0c;它为构建 Web 应用和 API 提供了一系列强大的功能。 核心特性 中间件支持&#xff1a;Express 使用中间件&#xff08;middleware&#xff09;函数来处理 HTTP 请求和响应。中间件可以访问请求对象&…

面壁智能MiniCPM4.0技术架构与应用场景

&#x1f4cb; 目录 1. 引言&#xff1a;端侧智能新时代2. MiniCPM4.0概述3. 核心技术架构 3.1 高效双频换挡机制3.2 稀疏注意力机制3.3 系统级优化创新 4. 技术突破与性能表现5. 应用场景深度解析 5.1 智能手机应用5.2 智能家居场景5.3 汽车智能化5.4 其他端侧应用 6. 行业影…

RabbitMQ路由核心解密:从Exchange到RoutingKey的深度实践与避坑指南

&#x1f50d; RabbitMQ路由核心解密&#xff1a;从Exchange到RoutingKey的深度实践与避坑指南 “消息去哪了&#xff1f;”——这是每位RabbitMQ使用者在调试时最常发出的灵魂拷问。 理解Exchange与RoutingKey的协作机制&#xff0c;正是解开路由谜题的关键钥匙。 一、Exchang…