Goroutine与Thread差异

go协程池(goroutine)、go线程池(Thread)、go连接池 一、go协程池(goroutine) 注意: Go语言中的goroutine虽然相对于系统线程来说比较轻量级(初始栈大小仅2KB),但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小 package main import ( "errors" "fmt" "log" "sync" "sync/atomic" "time" ) var ( // ErrInvalidPoolCap return if pool size <= 0 ErrInvali 阅读详情

Goroutine VS Thread

场景:启动四个线程或协程,每个任务单独累加50000000000次。
机器配置:intel i5-3470 3.2GHZ 8G win7 64 pro

代码如下
go:


package com.paxos.thread;

    public class TestThreadMultihttp {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            long i = 0;
            while (i < 50000000000l) {
                i++;
            }
        }
    };

    public static void main(String[] args) throws InterruptedException {
        Long a = System.currentTimeMillis();
        String[] users = new String[]{"a", "b", "c", "d"};
        for (String str : users) {
            TestThreadMultihttp t = new TestThreadMultihttp();
            Thread t1 = new Thread(t.r);
            t1.start();
            t1.join();
        }
        System.out.println(System.currentTimeMillis()-a);
    }
}

java:


package main

import (
    "sync"
    "time"
    "fmt"
    "runtime"
)

var wg sync.WaitGroup
var users = []string{"a", "b", "c", "d"}

func main() {
    runtime.GOMAXPROCS(4)
    fmt.Printf("Time begin %s \n", time.Now())
    wg.Add(len(users))
    for _, name := range users {
        go do(name)
    }
    wg.Wait()
    fmt.Printf("Time end %s \n", time.Now())
}

func do(name string) {
    defer wg.Done()
    var i = 0
    for {
        if i < 50000000000 {
            i++
        } else {
            return
        }
    }
}

运行时间:
GO:16.7(s)

JAVA:59.7(s)

原因分析:
java多线程运行中,没有把线程与cpu绑定,存在上下文切换(switch context)等,影响效率。
CPU Cache切换【1】:
CPU Cache分成了三个级别: L1, L2, L3. 级别越小越接近CPU, 所以速度也更快, 同时也代表着容量越小. L1是最接近CPU的, 它容量最小, 例如32K, 速度最快,每个核上都有一个L1 Cache(准确地说每个核上有两个L1 Cache,
一个存数据 L1d Cache, 一个存指令 L1i Cache). L2 Cache 更大一些,例如256K, 速度要慢一些, 一般情况下每个核上都有一个独立的L2 Cache; L3 Cache是三级缓存中最大的一级,例如12MB,同时也是最慢的一级, 在同一个CPU插槽之间的核共享一个L3 Cache.

从CPU到 大约需要的CPU周期 大约需要的时间(单位ns)
寄存器 1 cycle
L1 Cache ~3-4 cycles ~0.5-1 ns
L2 Cache ~10-20 cycles ~3-7 ns
L3 Cache ~40-45 cycles ~15 ns
跨槽传输 ~20 ns
内存 ~120-240 cycles ~60-120ns

go语言充分发挥了多核并行的优势,每个CPU都接近100%负荷运行,效率大大提高。

java进程图:
这里写图片描述

go进程图:
这里写图片描述

参考:
【1】http://coderplay.iteye.com/blog/1485760

GO 的goroutine(协程)和thread(线程)有什么区别 Thread 线程 在传统的web编程中,经常要用到多线程。比如 java,来一个websocket 即开启一个thread(线程)。 而thread的数目是有限的,一般的电脑可以同时开的thread数量大概几千个。而GO语言可以开启的goroutine,却可以达到几百万个,因此很显然goroutine不等于thread。 那么Thread和Goroutine的区别是什么? Thread,即多个程... 阅读详情

相关推荐

Go与Java核心差异及适用场景对比

编程语言的选择直接影响系统性能和开发效率。Go语言以其轻量级goroutine和channel机制实现了高效的并发处理,特别适合云原生和微服务场景,典型应用包括Docker和Kubernetes等基础设施。Java凭借成熟的JVM生态和丰富的框架体系,在企业级应用和大数据处理领域占据主导地位,Spring框架和Hadoop是其典型代表。从工程实践看,Go在容器化部署和快速迭代方面优势明显,而Java在复杂业务系统维护和IDE支持上更胜一筹。两种语言在性能表现上各有千秋,Go的HTTP处理速度更快,Java则

chengyixian7877的博客 484

Golang 协程和线程

Go 运行时能够在相对较少的操作系统线程上同时运行大量的协程,这是通过将协程的调度工作与操作系统的线程分开来实现的。通过协程,开发者可以轻松地编写高效的并发代码,而不必过多地关心底层的线程和锁机制。相反,Go 使用了一种称为“协程(goroutine)”的并发原语,它是一种轻量级的执行单位,由 Go 运行时进行调度,而不是由操作系统的线程来管理。因此,尽管 Go 中没有像传统编程语言中那样直接暴露线程的概念,但通过使用协程,开发者可以实现高效且安全的并发编程,而不必过多关心底层线程的管理和同步问题。

以学徒心态作为成长的基石,保持谦逊、不断学习。 384

Kali Linux渗透测试:蚁剑(AntSword)三种安装方法与避坑指南

WebShell管理是渗透测试与网络安全攻防演练中的关键技术环节,它允许安全人员在获得初步访问权限后,对目标系统进行文件管理、命令执行和数据库操作等深度控制。其核心原理是通过在Web服务器上植入特定脚本,建立一条隐蔽的远程管理通道。在实战中,一个高效、稳定的WebShell管理工具能极大提升后渗透阶段的工作效率与成功率。蚁剑(AntSword)作为一款功能强大的国产开源工具,凭借其插件化架构和图形化界面,成为众多安全研究人员的首选。本文将聚焦于如何在渗透测试专用操作系统Kali Linux上部署蚁剑,详细对

weixin_34413103的博客 414

10 分钟搞懂 Go 并发:Goroutine vs Thread,一看就会用

Go语言中的Goroutine与传统多线程对比 摘要: 传统多线程如Java的Thread存在创建开销大(MB级栈空间)、切换成本高(需内核介入)等痛点。而Go的Goroutine采用用户态调度,初始栈仅KB级,切换成本低,可轻松创建数万个并发任务。核心差异在于:Thread由OS内核调度,Goroutine由Go运行时管理;前者需要开发者自行处理线程池和同步,后者只需go关键字即可启动并发。通过WaitGroup实现协同等待,配合channel通信,使并发开发从"系统级难题"变为&qu

Pengyh的博客 1270

010Editor实战:5分钟破解Zip伪加密文件(附BUUCTF真题解析)

本文详细介绍了如何使用010Editor快速破解Zip伪加密文件,包括BUUCTF真题的完整解析。通过修改关键字节,轻松解除伪加密状态,适用于CTF竞赛和实际工作场景,提升文件处理效率。

weixin_29325007的博客 326

用逐飞STC32G库做个智能小车:编码器测速、PWM调电机、ADC读电池电压(完整项目)

本文详细介绍了如何使用逐飞科技的STC32G12K128开源库构建智能小车项目,涵盖编码器测速、PWM电机控制和电池电压监测等核心功能。通过硬件选型、开发环境搭建、代码实现及调试技巧的全流程讲解,帮助开发者快速掌握基于STC32G的嵌入式系统开发,实现高性能的智能小车控制。

weixin_42526417的博客 194

golang协程goroutine简介_golang goroutine

M必须拥有P才可执行G中的代码,P含有一个包含多个G的队列,P可以调度G交由M执行:在程序启动时,Go程序就会为main()函数创建一个默认的goroutine;在运行过程中,可随时通过go关键字来创建goroutine;所有 goroutine 会在 main() 函数结束时一同结束。GPM运行示意图如下所示(详情可见调度策略部分介绍)

2401_87197956的博客 488

Silvaco Atlas新手入门:从安装到第一个半导体器件仿真(附DeckBuild配置)

本文为Silvaco Atlas新手提供了一份从软件安装、DeckBuild环境配置到完成第一个半导体器件仿真的实战指南。通过构建一个经典的PN结二极管案例,详细讲解了Atlas仿真语句的语法、核心命令顺序以及结果调试与可视化方法,帮助初学者快速上手并理解TCAD仿真流程。

sql99的博客 332

Go最全golang协程goroutine简介_golang goroutine(1),2024年最新Golang开发入门与实战

当goroutine发生阻塞时,runtime会把当前goroutine调度走,让其他goroutine来执行,不让一个线程闲着。go runtime负责管理goroutine,Runtime会在程序启动的时候,创建M个线程(CPU执行调度的单位),之后创建的N个goroutine都会依附在这M个线程上执行。空闲的P会查询全局队列,若全局队列也空,则会从其他P中窃取G(一般每次取一半)。Go提供一种机制,可在线程中自己实现调度,上下文切换更轻量(达到线程数少,而并发数并不少的效果)。

2401_84920052的博客 385

Navcat最新版的激活和安装教程(全网最靠谱,最快捷的方式)

现在最新版本navcat已经出到了16.3了,并且新版navcat也支持连接redis和图标等更多样化的功能,但是比较头疼的一件事就是,只能试用14天。那么接下来小编教大家如何用最简单的方式使用最新版navcat16.

weixin_50737119的博客 2万+

从真题到策略:浙江工业大学计算机转专业机试全解析与备考指南

本文全面解析浙江工业大学计算机转专业机试的考试概况、典型真题和高频考点,提供详细的备考策略和面试准备建议。从机试题目类型到解题技巧,帮助考生高效备考,顺利通过这一竞争激烈的转专业关卡。

weixin_42524824的博客 421

Java线程只能有上千个,而Go的Goroutine能有上百万个

前言 哈喽,大家好,我是asong,我又来做知识分享了。对于做过Java开发的程序员来说,或许会遇到这个问题:java.lang.OutOfMemoryError: Unable to create new native thread。造成这个问题的原因是因为Thread限制导致内存溢出。对于这个问题,我们可以写一个小demo,测试一下这个问题: /** * 功能:Unable to create new native thread * 订阅号:Golang梦工厂 * create by asong

qq_39397165的博客 714

YOLO26改进策略【YOLO和Mamba】| 2024 VM-UNet,高效的特征提取模块VSS block 二次创新提高精度

VM-UNet模型设计的出发点是解决现有CNN-based和模型在医学图像分割中的局限性,利用(SSMs)的优势,提出一种更有效的医学图像分割模型。具体来说,CNN-based模型在捕捉长距离信息方面存在不足,而模型由于自注意力机制的二次复杂度导致计算负担较重。SSMs模型如Mamba不仅在建模长距离依赖方面表现出色,还具有线性计算复杂度,这为VM-UNet的设计提供了理论基础。

Limiiiing的博客 215

分布式和并发模型的比较和讨论记录

分布式和并发模型的比较和讨论记录

zhaojiew的学习笔记 1008

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Go核心特性(Java对比版)

Go核心特性摘要(Java对比版) Go语言的核心特性与Java存在显著差异: 接口实现:Go采用隐式接口实现机制,类型只需实现接口方法即可自动满足接口,无需显式声明implements,降低了代码耦合度。 错误处理:Go使用error返回值替代Java的异常机制,强制调用方显式处理错误,避免异常被忽略的问题。errors.Is/As支持错误链检查。 并发模型:Go通过轻量级的goroutine和channel实现并发,相比Java的Thread类更高效,支持百万级并发。 资源管理:defer关键字提供类似

2301_81699788的博客 653

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用户级线程 vs 内核级线程:如何选择?从Go语言协程到Java虚拟机的实战分析

本文深入分析了用户级线程(ULT)与内核级线程(KLT)的核心差异及适用场景,结合Go语言协程和Java虚拟机的实战案例,帮助开发者根据计算密集型或IO密集型需求选择合适的线程模型。文章详细对比了两种模型在创建耗时、上下文切换、内存占用等关键指标上的表现,并提供了混合架构的最佳实践建议。

weixin_29207533的博客 208

Java 快速转 Go

我们从 Java 老手的那句「这语言啥也没有」出发,把 Go 用 Java 的视角完整过了一遍。思维转换:从「面向对象」到「面向组合」;基础语法:类型后置、for一统循环、函数多返回值;类 → 结构体:struct + 接收者方法,值类型和指针要分清;继承 → 组合:嵌入(embedding)代替 extends,「组合优于继承」;接口:从显式 implements 到隐式「鸭子类型」;异常 → error:错误当返回值 +defer清理,显式且明确;并发。

weixin_52201538的博客 229

关于Goroutine 与JAVA Thread的探究笔记

很多有过 JVM 相关语言工作经验的程序员或许都遇到过如下问题: 额,超出 thread 限制导致内存溢出。在作者的笔记本的 linux 上运行,这种情况一般发生在创建了 11500 个左右的 thread 时候。 但如果你用 Go 语言来做类似的尝试,每创建一个 Goroutine ,并让它永久的 Sleep ,你会得到一个完全不同的结果。在作者的笔记本上,在作者等待的不耐...

QuancyZhang的博客 396

用户级线程与内核级线程的实战对比:如何选择最优线程模型

本文深入对比了用户级线程与内核级线程的核心差异与应用场景。用户级线程切换快、创建成本低,但一个线程阻塞会导致整个进程挂起,且无法利用多核;内核级线程则能有效处理阻塞、实现真正多核并行,但创建与切换开销较大。文章指出,现代高并发开发更倾向于采用混合模型(如协程),以兼顾灵活性与性能,并为不同场景下的线程模型选择提供了实操指南。

weixin_29304021的博客 214

从 Linux fork 到 Go goroutine:并发模型的演化与思维迁移

fork(进程)↓thread(线程 + 锁)↓goroutine(语言级并发 + channel)在保留其核心理念的同时,大幅降低了并发的使用门槛。这也是 Go 能在现代后端和系统工具领域迅速流行的重要原因之一。

Annihilatrain的博客 604

并发之痛 Thread,Goroutine,Actor

协程的本质 单线程实现并发。 协程在配合异步非阻塞的设计时,面对io问题时能承受比较大的并发量。 面对非io问题如计算问题,还是没有多线程优势,因为多线程能利用多核。 并发与并行 并发:concurrent 并行:paralle 并发:是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机上运行。...

justsomebody126的专栏 358

从 Thread 到 goroutine:为什么 Go 能轻松跑百万协程?

把「开线程」换成「go 关键字」,把「线程池」换成「按需 goroutine + errgroup」,把「Future.get()」换成「channel 或 WaitGroup」——这是 Java 人转 Go 的第一道思维关。理解 GMP 模型后,你会明白为什么 Go 从语言层就为高并发而生。

weixin_51864284的博客 661

golang中goroutine和线程的区别?

golang中goroutine和线程的区别

GOLANG ROADMAP 717

Go语言高性能并行计算实战:从Goroutine到CGO与OpenMP融合

并行计算是提升程序性能、充分利用多核处理器能力的关键技术,其核心原理是通过同时执行多个计算任务来缩短整体运行时间。在技术实现上,共享内存模型和消息传递模型是两种主流范式,前者允许线程直接访问共同内存空间,后者则通过通信来协调任务。对于计算密集型应用,如科学计算、数据分析和机器学习,高效的并行化能带来显著的性能提升。在Go语言生态中,开发者虽然不能直接使用OpenMP,但可以通过Goroutine、Channel、原子操作和互斥锁等原生并发原语,构建出高性能的并行计算方案。本文深入探讨了如何将OpenMP的核

weixin_33749242的博客 460
上一篇: Sodium密码库 PART1
下一篇: windows7 visio studio 2015 编译 mysql source code
AI干IT
博客等级 码龄18年 50粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值