Golang中的协程是什么

news/2025/3/30 0:55:18/文章来源:https://www.cnblogs.com/ashet/p/18795096

在 Go 语言中,协程(goroutine) 是一种轻量级的线程,由 Go 运行时(Go runtime)进行管理。

Goroutine 的特点

  1. 轻量级:与传统的操作系统线程相比,goroutine 的创建和销毁成本非常低。这得益于 Go 运行时对线程池和调度器的优化。

  2. 并发执行:多个 goroutine 可以在同一个操作系统线程上并发执行,由 Go 运行时调度器自动管理。

  3. 栈大小动态调整:goroutine 的栈大小是动态调整的,初始时很小(通常几 KB),在需要时会自动增长,从而避免了不必要的内存浪费。

 

既然协程goroutine是轻量级线程,那么就意味着多个协程很可能属于一个线程,那么在Golang中使用协程会不会发生分配的5个协程都在一个线程中,导致操作系统没有真正的使用多核cpu并行处理多个任务?

Go runtime 会将(同一任务的)协程(goroutine)分配给不同的操作系统线程,由 Go 的调度器(scheduler)根据当前系统的负载和配置动态分配。

 

Go 的调度器(scheduler)基于 GMP 模型,其中 G 代表 goroutine,M 代表操作系统线程,P 代表逻辑处理器。

每个操作系统线程(M)都可以绑定到一个逻辑处理器(P)上,逻辑处理器负责管理 goroutine 队列和调度 goroutine 的执行。

当一个新的协程被创建时,它会被放入调度器的全局队列或某个逻辑处理器的本地队列中等待执行。

调度器会根据当前系统的负载、线程的数量、逻辑处理器的状态等因素,动态地将 goroutine 分配给合适的操作系统线程执行。

 

协程在相同的地址空间中运行,因此对共享内存的访问必须进行同步。协程在相同的地址空间中运行,因此对共享内存的访问必须是同步阻塞的。协程在相同的地址空间中运行,因此对共享内存的访问必须是同步访问。

协程(goroutine)是轻量级线程,它们在相同的地址空间中运行,这意味着多个协程可以直接访问相同的全局变量、指针指向的堆上数据等。如果多个协程同时读写共享变量,可能会出现数据竞争(data race),导致未定义行为,因此需要同步机制(如 sync.Mutexsync.RWMutexsync/atomic)来保证数据一致性。

Go 官方推荐使用 channel 而非锁来避免数据竞争,典型的 Go 并发风格是:

func main() {// Channel是类型安全的,这确保了通过它传递的数据的一致性。类型安全特性减少了因类型不匹配而导致的错误。// Channel内置了同步机制,发送和接收操作会自动进行同步,从而保证了共享数据的一致性。这种内置同步机制减少了程序员需要手动编写的同步代码量。// Channel传递数据时,内存屏障会自动插入,以保证内存操作的可见性和一致性。// Channel的发送和接收操作是原子的,这意味着它们不会被中断或干扰,从而确保了数据的一致性和顺序性。ch := make(chan int, 1)go func() {ch <- 42 // 发送数据}()value := <-ch // 接收数据fmt.Println(value)
}

 

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

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

相关文章

Elasticsearch 的搜索功能

Elasticsearch 的搜索功能建议阅读顺序:Elasticsearch 入门 Elasticsearch 搜索(本文)1. 介绍 使用 Elasticsearch 最终目的是为了实现搜索功能,现在先将文档添加到索引中,接下来完成搜索的方法。 查询的分类:叶子查询:叶查询子句在特定字段中查找特定值,例如 match、t…

20242213 实验二《Python程序设计》实验报告

20242213 2024-2025-2 《Python程序设计》实验2报告 课程:《Python程序设计》 班级: 2422 姓名: 刘宗林 学号:20242213 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 1.实验内容设计并编写一个计算器程序,实现基本运算功能;功能包括加、减、乘、除、取余…

《实战Java高并发程序设计(第3版)》 | PDF免费下载

《实战Java高并发程序设计(第3版)》主要介绍基于Java的并行程序设计基础、思路、方法和实战。第一,立足于并行程序基础,详细介绍Java并行程序设计的基本方法。第二,进一步详细介绍JDK对并行程序的强大支持,帮助读者快速、稳健地进行并行程序开发。第三,详细讨论“锁”的…

《DeepSeek原理与项目实战》 | PDF免费下载

DeepSeek 是一种基于 Transformer 架构的生成式 AI(Artificial Intelligence)大模型,融合了MoE 架构、混合精度训练、分布式优化等先进技术,具备强大的文本生成、多模态处理和任务定制化能力。本书系统性地介绍了开源大模型 DeepSeek-V3 的核心技术及其在实际开发中的深度应…

实现极限网关(INFINI Gateway)配置动态加载

还在停机更新 Gateway 配置,OUT 了。 今天和大家分享一个 Gateway 的功能:动态加载配置(也称热更新或热加载)。 这个功能可以在 Gateway 不停机的情况下更新配置并使之生效。 配置样例如下: path.data: data path.logs: logconfigs:auto_reload: true # set true to auto …

ubuntu20.04安装Synergy

问题 最近在Ubuntu20.04上安装新版本的Synergy遇到一些问题,Synergy最后一个支持ubuntu20.04的版本是v3.1.3-beta,下面是下载地址: https://symless.com/synergy/download/other 在安装的时候遇到下面的问题:提示依赖libssl1,然后尝试安装下面的软件包: sudo apt install…

Netty源码—7.ByteBuf原理二

大纲 9.Netty的内存规格 10.缓存数据结构 11.命中缓存的分配流程 12.Netty里有关内存分配的重要概念 13.Page级别的内存分配 14.SubPage级别的内存分配 15.ByteBuf的回收9.Netty的内存规格 (1)4种内存规格 (2)内存申请单位(1)4种内存规格 一.tiny:表示从0到512字节之间的内存大…

一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量

在 Python 多线程编程中,线程同步是确保多个线程安全访问共享资源的关键技术。本篇文章介绍了互斥锁(Lock)、递归锁(RLock) 和 信号量(Semaphore) 的概念与应用。互斥锁用于防止多个线程同时修改数据,递归锁适用于嵌套锁定场景,而信号量则限制同时访问资源的线程数。一…

K3D|高效创建轻量级 k8s 集群 (run in dokcer)

k3d 是一个轻量级的包装器,用于在 docker 中运行 k3s(Rancher Lab 的最小 Kubernetes 发行版)什么是 K3S 官网:https://k3s.io/ 指南:https://rancher.com/docs/k3s/latest/en/ 中文版指南:https://docs.rancher.cn/docs/k3s/_index/ K3s 是一个轻量级的 Kubernetes 发行…

记录一下安装适用于intel 显卡的torch

支持的硬件和驱动如下按照表格安装好驱动。使用conda创建好虚拟环境(Python 3.9, 3.10, 3.11, 3.12, 3.13.)后,我的显卡是arc A580# For hardware listed in the table above, other than Intel Core™ Ultra Series 2 Mobile Processors (Arrow Lake-H), use the commands …

AP CSA FRQ Q2 Past Paper 五年真题汇总 2023-2019

Author(wechat): bigshuang2020 ap csa tutor, providing 1-on-1 tutoring. 国际教育计算机老师, 擅长答疑讲解,带学生实践学习。 热爱创作,作品:ap csa原创双语教案,真题梳理汇总, AP CSA FRQ专题冲刺, AP CSA MCQ小题狂练。2023 FRQ Q2 Sign This question involves met…

RabbitMQ的核心组成部分即分发模式

核心概念:Server:又称Broker ,接受客户端的连接,实现AMQP实体服务。 安装rabbitmq-serverConnection:连接,应用程序与Broker的网络连接 TCP/IP/ 三次握手和四次挥手Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各…