go协程goroutine与Java多线程比较

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

引言:

个人理解的线程,协程和单,多核线程

1. 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已(cpu时间切片), 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,效率不会有提高的,切换线程反倒会增加开销(线程的上下文切换),宏观的可看着并行,单核里面只是并发,真正执行的一个cpu核心只在同一时刻执行一个线程(不是进程)。
  2. 多线程的用处在于,做某个耗时的操作时,需要等待返回结果,这时用多线程可以提高程序并发程度。如果一个不需要任何等待并且顺序执行能够完成的任务,用多线程是十分浪费的。
  3. 个人见解,对于Thread Runable以及ThreadPoolExcutor等建立的线程,线程池 内部是使用单核心执行(伪并行的并发多线程) 这里更正下,因为Java Thread Runable新建的线程最终是通过本地调用新建的os线程,而调度则完全交由os操作系统进行调度,尽管jvm是系统的一个进程,但cpu的最小调度单位是线程而非进程(linux线程和进程没有明显的划分界限),所以Java中的多线程仍然可能会被os调度到多cpu中进行执行。jdk1.7中提供的fork/join并发框架,使用的是多核心任务切分执行,个人觉得和map/reduce有一定类似之处。
  4. 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。而线程的调度是操作系统内核控制的,通过用户自己控制,可减少上下文频繁切换的系统开销,提高效率。

环境:

  1. ubuntu 16.04 LTS
    ###测试过程
    对比程序,系统发生1千万次并发,并发为一个无操作的空函数,使用time指令对比性能
    java完整版

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by zhoudazhuang on 14-8-15.
 * jdk1.7以及一下
 * new Runnable() {
@Override
public void run() {

}
jdk1.8可使用lambda
() -> {}
 * 1. javac Main.java
 * 2. java Main(java二进制字节码,这样就可以运行了 不过这里再准备打包成运行jar包)
 * 3. jar -cvf my.jar *.class
 * 4.  time java -server -jar my.jar my.jar中没有主清单属性 修改压缩jar中MANIFEST.MF添加Main-Class:要空一格Main(主类class名字,有包加包 或者第二种方法直接在参数中指定)
 * 5. 改好后使用 time java -server -jar my.jar 或者直接使用time java -cp ./my.jar Main //主要不要用-jar了 -cp 目录和zip/jar文件的类搜索路径 直接指定就可以了
 * 输出
 * # time java -server -jar my.jar
 * elapsed time: 0.041s
 *  java -server -jar my.jar  0.26s user 0.01s system 215% cpu 0.126 total
 * time ls; time java是linux命令 不用-server我感觉输出也一样
 */
public class Main {
    private static final int TIMES = 100 * 1000 * 100;
    public static void main(String[] args) throws Exception {
        ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        long t1 = System.currentTimeMillis();
        for (int i=0;i<TIMES;i++) {
            service.submit(new Runnable() {
                @Override
                public void run() {

                }
            });
        }
        service.shutdown();
        long t2 = System.currentTimeMillis();
        System.out.printf("elapsed time: %.3fs\n", (t2-t1)/1000f);
    }
}

输出

# time java -cp ./my.jar Main
elapsed time: 14.589s
java -cp ./my.jar Main  75.20s user 2.96s system 486% cpu 16.072 total

golang完整版

//对比程序,系统发生1亿次并发,并发为一个无操作的空函数,使用time指令对比性能
package main

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

const (
	TIMES = 100 * 1000 * 100
)

func main() {
	runtime.GOMAXPROCS(runtime.NumCPU())
	fmt.Println("CPUs:", runtime.NumCPU(), "Goroutines:", runtime.NumGoroutine())
	t1 := time.Now()
	for i:=0; i<TIMES; i++ {
		go func() {}()
	}

	for runtime.NumGoroutine() > 4 {
		//fmt.Println("current goroutines:", runtime.NumGoroutine())
		//time.Sleep(time.Second)
	}
	t2 := time.Now()
	fmt.Printf("elapsed time: %.3fs\n", t2.Sub(t1).Seconds())
}

执行结果:

CPUs: 8 Goroutines: 1
elapsed time: 3.582s
./compareJava  13.09s user 1.49s system 405% cpu 3.591 total

由于多线程的处理机制不同,java的处理时间,cpu负载等明显高与goroutine,所以在此种情况下,goroutine在并发多任务处理能力上有着与生俱来的优势。

后记

示例程序主要参考自:https://my.oschina.net/u/209016/blog/301705

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程 你将懂得协程和线程的区别、协程的原理与优缺点、以及怎样在Java中使用协程 阅读详情

相关推荐

分布式定时任务(XXL-JOB)整合达梦数据库 带源码

背景 1. 因公司需要可视化管理配置调度任务,查询项目选择XXL-JOB,它是开源项目,入手很简单,详情可以参考官方文档; 2. 因项目的机密性,选择数据库为国内知名的达梦数据库7,与Java项目的整合详情可以参考SpringBoot 集成 达梦数据库 maven依赖本地jar包; 3. 因XXL-JOB暂时没有找到集成达梦数据库的案例,博主自己整合DM7踩过很多的坑,特此整合一个简单可直接...

艾斯-李的博客 3814

go和java线程_go协程goroutine与Java多线程比较

引言:个人理解的线程,协程和单,多核线程1. 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已(cpu时间切片), 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,效率不会有提高的,切换线程反倒会增加开销(线程的上下文切换),宏观的可看着并行,单核里面只是并发,真正执行的一个cpu核...

weixin_39583162的博客 519

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

Go之并发处理(售票问题)

老问题:模拟一个售票窗口进行售票   先定义类型Ticket(车票)和Conductor(销售员)--偷懒了,把售票和产票都交给Conductor了 package util import () //-------------------------------- type Ticket struct { ID int Price string Type ...

weixin_34346099的博客 539

【密码专栏】超强进阶:PLONK VS Groth16(上)

前言 前文《天冷了,干了这碗“零知识证明”鸡汤》对「零知识证明学习」作了一个形象化的比喻:炖鸡汤。那么本系列的主要内容可以简单概括为《论高压锅炖鸡汤的一百种方法》之方法二。在学会了“清炖鸡汤”之后,不如来一口“阿胶鸡汤”补补脑细胞吧! 正如鸡汤不同风味之间各具千秋,不同的zk-SNARK方案也各有所长。zk-SNARK方案可以被分为【通用】与【非通用】zk-SNARK,PLONK与Groth16分别是其中的典型代表。通过本系列,我们将对PLONK算法内容作简要介绍,并指出PLONK和Groth16算法思路上

Hyperchain的博客 1805

UQLab——其他概率分布随机变量转换标准Gaussian分布

1、使用UQLab将其他类型的随机变量转换成标准Gaussian分布; 2、使用科学计数法输出样本,方便后续ANSYS的调用分析; 3、基于MC的可靠度分析。 原随机变量分布类型: % 调用UQLab进行采样 clc clear uqlab %% Specify these distributions as a UQLab INPUT object: PriorOpts.Marginals(1...

ikhui7的博客 3013

Go语言利用channel模拟并发售票

初学go,正好学到goroutine和channel,配合之前做商城的经验,模拟一下并发状态下售票场景。

GolangAndPHP的博客 454

手把手教你用DLP4500和海康相机搭建双目结构光系统(附完整代码获取路径)

本文详细介绍了如何利用DLP4500投影仪和海康工业相机搭建低成本双目结构光三维测量系统。从硬件选型、软件配置到结构光编码解码实现,再到三维重建全流程,提供了完整的实战指南和优化技巧,帮助用户以不到2万元的预算实现0.05mm精度的三维扫描。

weixin_32447969的博客 316

golang和Java比较

Golang(也被称为Go)和Java都是流行的编程语言,都有自己的优点和用途。下面是Golang和Java之间的一些比较。

runqu的博客 2718

基于STM32与FPGA Cyclone IV的FSMC高速数据通信实战解析

本文详细解析了基于STM32的FSMC接口与FPGA Cyclone IV实现高速并行数据通信的实战方案。通过将FPGA模拟为SRAM设备,构建了MCU与FPGA之间的高速数据通道,并深入探讨了硬件连接、STM32软件配置、FPGA逻辑设计及性能优化等关键步骤,为图像处理、高速采集等需要大数据量交换的嵌入式应用提供了稳定高效的通信解决方案。

swift5iosmith的博客 294

09 SAP CPI 访问公共API接口

我在网上找了一个公共API,入参输入汉字返回拼音。至此,一个真正的访问API的接口就做好了。点击保存时可看到红叉报错。

SAP CPI 477

java threads 中文_为什么 Go 允许百万级别的 goroutines,而 Java 只允许数千级别的 threads?...

很多有过 JVM 相关语言工作经验的程序员或许都遇到过如下问题:[error] (run-main-0) java.lang.OutOfMemoryError: unable to create native thread:[error] java.lang.OutOfMemoryError: unable to create native thread:[error] at java.b...

weixin_42135753的博客 241

定位教程0---定位初介绍

定位教程0---定位算子介绍

Quintin 1万+

go协程和java线程_go协程goroutine与Java多线程比较

引言:个人理解的线程,协程和单,多核线程1. 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已(cpu时间切片), 系统给每个线程分配时间片来执行, 每个时间片大概10ms左右, 看起来像是同时跑, 但实际上是每个线程跑一点点就换到其它线程继续跑,效率不会有提高的,切换线程反倒会增加开销(线程的上下文切换),宏观的可看着并行,单核里面只是并发,真正执行的一个cpu核...

weixin_33346418的博客 615

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

进程、线程、协程、goroutine区别

        在golang开发的过程中相信大家最经常接触的就是go协程,但对于什么是协程以及什么是go协程,可能还停留在go出去的就是协程这个表面认知,这不仅会给我们项目带来隐藏的问题。对此,结合一些资料,从操作系统的角度来对进程,线程,协程进行介绍,并试着说明协程和goruntine是什么。 一、概念理解   1、进程         进程是具有一定独立功能的程序关于某个数据集合上的一...

SlagSea 1万+

android 蓝牙通讯demo

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

golang高级进阶(一):进程、线程、并发、并行、goroutine协程

目录 一、关于进程和线程 1. 进程(Process) 2. 线程 二、关于并发和并行 1. 并发 2. 并行 3. 通俗讲 三、goroutine协程以及主线程 1. 主线程 2. 协程 3. 多协程和多线程 四、go关键词实操 1. 顺序执行 2. 加入go 3. 加入时间 4. 主线程执行快的情况 5. sync.WaitGroup解决不等待 6. 多协程并发并行执行 五、设置golang运行时占用的cpu核数量(不是很重要) 重点:这一篇全是干货,一定要多

genziisme的专栏 6908

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深入浅出Go并发之协程—goroutine

1 梳理概念:进程、线程、协程 1.1 进程 在《计算机操作系统》一书中,进程这样被解释: 进程是进程实体的运行过程,是程序的基本执行实体,是系统进行资源分配和调度的一个独立单位。进程实体 = 程序段 + 相关数据段 + 进程控制块(PCB), 进程的特性:①动态性 ②并发性 ③独立性 ④异步性 ⑤结构性 进程的三种基本状态:就绪(Ready)状态、执行(Running)状态、阻塞(Block)状态 1.2 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 同一

做兴趣使然的Hero 1835

Golang——8、协程和管道

本文介绍了Go语言中的协程(goroutine)和管道的使用。协程是轻量级线程,相比传统线程占用内存更少、切换开销更小。文章通过示例演示了如何使用sync.WaitGroup实现主线程等待协程完成,以及如何启动多个协程并行处理任务。在素数统计案例中,协程将计算时间从12秒缩短至3秒。 管道是Go语言中协程间的通信机制,遵循先进先出原则。文章讲解了管道的创建、发送接收数据等基本操作,并指出管道类似队列结构。通过协程和管道的配合,可以实现高效的并发编程。这些特性使Go语言在处理高并发任务时具有显著优势。

Talon的博客 1276

什么是协程goroutine?

Goroutine 是一个由 Go 运行时管理的轻量级线程,一般称其为 “协程”。操作系统本身是无法明确感知到 Goroutine 的存在的,Goroutine 的操作和切换归属于 “用户态” 中。Goroutine 由特定的调度模式来控制,以 “多路复用” 的形式运行在操作系统为 Go 程序分配的几个系统线程上。

西京刀客 1145

浅析Java的线程和Golang的协程

Java的多线程 线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,Java的多线程是通过JMM(共享内存模型)来实现的。 大部分的操作系统都是利用时间片轮转的抢占式调度方式,线程需要利用操作系统的调度算法在用户态和内核态来回切换,线程的切换是非常浪费资源的,所以Java的线程池在工作中才那么常用,也是面试中无法绕过的坎。 程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Lightweight Pro

程铭程铭你快成名的博客 4040

Golang协程goroutine

进程,线程和协程概念 需要区分进程、线程(内核级线程)、协程(用户级线程)三个概念。 进程 进程是程序在一个数据集上的一次运行过程。 进程是操作系统进行资源分配的基本单位。 每个进程都有自己的独立内存空间,不同进程通过进程间同步信号量来通信。 由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 线程 线程是进程中的一个...

搬砖信条 800

Golang协程

text商场 (计算机)├── 店铺A (进程A)│ ├── 正式员工1 (线程1) -- 由【商场总管理处】(内核态)调度│ ├── 正式员工2 (线程2) -- 由【商场总管理处】(内核态)调度│ └── 一群实习生 (协程) -- 由【店长】(用户态调度器)管理,跑在几个正式员工身上├── 店铺B (进程B)流程演进:一个店铺只有一个员工(单线程进程),效率低。一个店铺雇多个员工(多线程进程),效率高了,但雇佣和管理成本(创建/切换线程的开销)也高了。

qq_48512649的博客 919

Go-goroutine(协程)和channel(管道)

Go-goroutine(协程) 1.goroutine基本介绍 1.1 进程和线程说明: 1)进程就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。 2) 线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。 3)一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行。 4)一个程序至少有一个进程,一个进程至少有一个线程 1.2 并发和并行 1)多线程程序(进程中含有多个执行实例/线程)在单核上运行,就是并发。 2)多线程程序在多核上运

ALEX_CYL的博客 1891

goroutine 返回值_Go语言 | CSP并发模型与Goroutine的基本使用

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是golang专题的第13篇文章,我们一起来聊聊golang当中的并发与Goroutine。在之前的文章当中我们介绍完了golang当中常用的使用方法和规范,在接下来的文章当中和大家聊聊golang的核心竞争力之一,并发模型与Goroutine。我们都知道并发是提升资源利用率最基础的手段,尤其是当今大数据时代,流量对于一家互联网企业的重...

weixin_29628479的博客 1129

golang入门系列之浅谈 goroutine

写在前面        本文内容是我继上篇入门学习go的个人理解,如有错误,欢迎斧正。       之前早有耳闻 Go 在高并发场景下,能够充分利用多核,在语言层面支持并发、轻量高效等优点,奈何沉迷Java生态,未曾尝试跳出来了解。前天花了几个小时入门,冲着goroutine我入坑了(当然并不是无脑吹,协程是解决问题的思维方式,并不能解决所有的问题),所以秉承着或奉献或分享或记录的.

CodeHunter_qcy 2439

Go——Goroutine介绍

在java/c++中我们要实现一个并发编程,我们通常需要自己维护一个线程池,并且需要自己取包装一个有一个任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量心智。那么能不能有一种机制,程序员只需要定义很多任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢?Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。

weixin_57023347的博客 1654
上一篇: ubuntu 安装本地版storm并运行WordCount
下一篇: golang Garbage Collector(GC)
anteoy
博客等级 码龄10年 24粉丝 83原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值