首页 > 系统相关 >Golang goroutine 进程、线程、并发、并行

Golang goroutine 进程、线程、并发、并行

时间:2023-10-03 10:07:09浏览次数:35  
标签:10 goroutine 并行 Golang 并发 线程 cpu


goroutine  看一个需求


需求:要求统计1-200000000000的数字中,哪些是素数?

分析思路:

1)传统的方法,就是使用一个循环,循环的判断各个数是不是素数(一个任务就分配给一个cpu去做,这样很不划算,而且非常慢)

2)使用并发或者并行的方式,将统计素数的任务分配给多个goroutine去完成,这时就会使用到goroutine(速度和核数有关)

goroutine可以做一个并发和并行处理,可以让一个很大的任务分解到各个goroutine去完成。

 

进程和线程说明


1)进程就是程序程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位

2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。

3)一个进程可以创建核销毁多个线程,同一个进程中的多个线程可以并发执行。

4)一个程序至少有一个进程,一个进程,至少有一个线程

Golang goroutine 进程、线程、并发、并行_多线程

双击迅雷就会启动一个进程,一个迅雷可以下载多个文件。每个下载任务可以看成一个线程,这样才能够发挥cpu最大的一个性能。

并发,不适并行,从效果上说好像是5个同时下载,其实就是时间片很短,从微观的角度看其实就是一个时间点只有一个文件在下载。

Golang goroutine 进程、线程、并发、并行_多线程_02

 

 

 

并发和并行


1)多线程程序在单核上运行,就是并发

2)多线程程序在多核上运行,就是并行

并发:因为是在一个cpu上,比如有10个线程,每个线程执行10毫秒(进行轮询操作),从人的角度看,好像这10个线程都在运行,但是从微观上看,在某一个时间点看,其实只有一个线程在执行,这就是并发。

并行:因为是在多个cpu上(比如有10个cpu),比如有10个线程,每个线程执行10毫秒(各自在不同cpu上执行),从人的角度看,这10个线程都在运行,但是从微观上看,在某一个时间点看,也同时有10个线程在执行,这就是并行

传统的编程语言,即使有多任务也是分配在一个cpu上面的,这样多核是不能发挥威力。

go语言就是要将并发转化为并行。

Golang goroutine 进程、线程、并发、并行_多核_03

Golang goroutine 进程、线程、并发、并行_多线程_04

标签:10,goroutine,并行,Golang,并发,线程,cpu
From: https://blog.51cto.com/u_14035463/7689613

相关文章

  • Golang gorm manytomany 多对多 更新、删除、替换
       Delete移除只删除中间表的数据  删除原有的varaArticle1 db.Preload("Tag1s").Take(&a,1) fmt.Printf("%v",a){1k8s[{1cloud[]}{2linux[]}]}mysql>select*fromarticle1;+----+--------+|id|title|+----+--------+|1|k8s......
  • Golang gin Cookie的使用
    Cookie介绍HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出Cookie就是解决HTTP协议无状态的方案之一,中文是小甜饼的意思Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同......
  • Golang Array 数组使用注意事项和细节
    在go数组当中,长度是数据类型的一部分[3]int  *[3]int  数组使用注意事项和细节1)数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化vara[3]inta[0]=1.1这样是不行的,必须是整数2)vararr[]int这时arr就是一个slice切片(如果[]里面没......
  • redis7源码分析:redis 多线程模型解析
    多线程模式中,在main函数中会执行InitServerLastvoidInitServerLast(){bioInit();//关键一步,这里启动了多条线程,用于执行命令,redis起名为IO线程initThreadedIO();set_jemalloc_bg_thread(server.jemalloc_bg_thread);server.initial_memory_usage=......
  • 线程池
    ......
  • redis7源码分析:redis 单线程模型解析,一条get命令执行流程
    有了下文的梳理后redis启动流程再来解析redis在单线程模式下解析并处理客户端发来的命令1.当clientfd可读时,会回调readQueryFromClient函数voidreadQueryFromClient(connection*conn){client*c=connGetPrivateData(conn);intnread,big_arg=0;size_......
  • 如何获取 C#程序 内核态线程栈
    一:背景1.讲故事在这么多的案例分析中,往往会发现一些案例是卡死在线程的内核态栈上,但拿过来的dump都是用户态模式下,所以无法看到内核态栈,这就比较麻烦,需要让朋友通过其他方式生成一个蓝屏的dump,这里我们简单汇总下。二:如何生成内核态dump1.案例代码为了方便演示,来一段简单的......
  • 9.2 运用API实现线程同步
    Windows线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性。Windows提供了多种线程同步机制,以适应不同的并发编程场景。主要包括以下几种:事件(Event):用于不同线程间的信......
  • pthread实现多线程矩阵乘法
    #include<pthread.h>#include<stdio.h>#include<windows.h>#include<iostream>usingnamespacestd;#pragmacomment(lib,"pthreadVC2.lib")#definerowCount1300#definemediumCount1500#definecolumnCount5000#definen_threa......
  • 线程的三种创建方式
    一、线程的三种创建方式:1、继承Tread类,重写run方法;2、实现 Runnable接口,实现run方法;3、实现Callable接口,实现call方法,该方式可以获取线程的执行结果。二、继承Tread类1、创建步骤:创建一个继承于Thread类的子类重写Thread类的run()方法->此线程执行的操作声明在......