2.25 Go并发,Goland并发

2.25 Go并发,Goland并发

Go语言并发编程的特点

Go语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go语言的并发通过goroutine特性完成。goroutine类似于线程,可以根据需要创建多个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。

goroutine间通信:

goroutinechannelGo秉承的CSPCommunicating Sequential Process并发模式的重要实现基础,Go语言提供channel在多个goroutine间进行通信。

Go的并发编程特点:

  • 语言层面支持并发

  • 实现了垃圾回收机制

Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。

并发的一些概念

  • 进程/线程

  • 并发/并行

  • 协程/线程


进程

进程是程序在操作系统中的一次执行过程系统进行资源分配和调度的一个独立单位。--->操作系统级别的

线程

线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。--->是线程级别的

一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。--->线程与进程的关系

概括:

进程就像一个个项目组,线程是指里面的项目参与人员。一个项目的启动需要很多个角色的人员参与。就是单进程与多线程。并发就是指项目参与人员同时工作而不是流程性的先后工作。

并发

多线程程序在单核心的cpu上运行,称为并发--->并发的概念核心是单核CPU。因为之前语言诞生的时候CPU还没有发展到多核

并发的实现原理:

并发主要由切换时间片来实现“同时”运行

并行

多线程程序在多核心的cpu上运行,称为并行

并行实现原理:

并行是利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力

协程

独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的

线程

一个线程上可以跑多个协程,协程是轻量级的线程。

Goroutine介绍

GoroutineGo语言并发设计的核心,是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务

Goroutine的本质:

goroutine其实就是线程,比线程更小。十几个goroutine可能体现在底层就是五六个线程,而且Go语言内部也实现了goroutine之间的内存共享--->这一点是区别于线程的存在。如java的多线程之间不共享内存。需要到公共的区域交换资源。

什么是Goroutine

  • 使用go关键字创建goroutine

  • go声明放到一个需调用的函数之前

  • 在相同地址空间调用运行这个函数

该函数执行时便会作为一个独立的并发线程,这种线程在Go语言中则被称为goroutine

goroutine用法:

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
   //do someting...
}

goroutine在多核cpu环境下是并行的,如果代码块在多个goroutine中执行,那么我们就实现了代码的并行

获取并行(多核CPU运行的结果)的结果

Goroutine间的通信方式:

channel

什么是channel

channel是进程内的通信方式,通过channel传递对象的过程和调用函数时的参数传递行为比较一致

channel特点:

channel是类型相关的,一个channel只能传递一种类型的值。这个类型需要在声明channel时指定

声明channel的特点

定义一个channel需要:

  • 定义发送到channel的值的类型

  • 必须使用make创建channel

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

对并发与非并发的定义

命令式程序设计语言及运行特点

以串行为为基础,程序会顺序执行每一条指令

整个程序只有一个执行上下文,即一个调用栈,一个堆。

并发的特点

程序在程序运行时有多个执行上下文,多个调用栈。

进程运行时的特点

每一个进程运行时都有自己的调用栈、堆,都有一个完整的上下文。

操作系统在调度进程的时候,会保存被调度进程的上下文环境,等该进程获得时间片后,再恢复该进程的上下文到系统中。

从整个操作系统层面来说,多个进程是可以并发的

并发的价值

  1. 需要灵敏响应的图像用户界面

  2. 程序需要执行大量的计算或者I/O密集操作。需要让响应与运算同时执行

  3. Web服务器面对大量用户请求时,需要有更多的“Web服务器工作单元”来分别响应用户

  4. 事务处于分布式环境上,相同的工作单元在不同的计算机上处理着被分片的数据。计算机的CPU从单内核(core)向多内核发展,而我们的程序都是串行的,计算机硬件的能力没有得到发挥。

  5. 程序因为I/O 操作被阻塞,整个程序处于停滞状态,其他I/O无关的任务无法执行。

并发的优势

  • 并发能更客观地表现问题模型;

  • 并发可以充分利用CPU核心的优势,提高程序的执行效率;

  • 并发能充分利用CPU与其他硬件设备固有的异步性。

posted @ 2022-02-28 10:21  俊king  阅读(141)  评论(0)    收藏  举报