2.25 Go并发,Goland并发
Go语言并发编程的特点
Go语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go语言的并发通过goroutine特性完成。goroutine类似于线程,可以根据需要创建多个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。
goroutine间通信:
goroutine和channel是Go秉承的CSP的Communicating Sequential Process并发模式的重要实现基础,Go语言提供channel在多个goroutine间进行通信。
Go的并发编程特点:
-
语言层面支持并发
-
实现了垃圾回收机制
Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。
并发的一些概念
进程/线程
并发/并行
协程/线程
进程
进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。--->操作系统级别的
线程
线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。--->是线程级别的
一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行。--->线程与进程的关系
概括:
进程就像一个个项目组,线程是指里面的项目参与人员。一个项目的启动需要很多个角色的人员参与。就是单进程与多线程。并发就是指项目参与人员同时工作而不是流程性的先后工作。
并发
多线程程序在单核心的cpu上运行,称为并发--->并发的概念核心是单核CPU。因为之前语言诞生的时候CPU还没有发展到多核
并发的实现原理:
并发主要由切换时间片来实现“同时”运行
并行
多线程程序在多核心的cpu上运行,称为并行
并行实现原理:
并行是利用多核实现多线程的运行,Go程序可以设置使用核心数,以发挥多核计算机的能力
协程
独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的
线程
一个线程上可以跑多个协程,协程是轻量级的线程。
Goroutine介绍
Goroutine是Go语言并发设计的核心,是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务
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{})
对并发与非并发的定义
命令式程序设计语言及运行特点
以串行为为基础,程序会顺序执行每一条指令
整个程序只有一个执行上下文,即一个调用栈,一个堆。
并发的特点
程序在程序运行时有多个执行上下文,多个调用栈。
进程运行时的特点
每一个进程运行时都有自己的调用栈、堆,都有一个完整的上下文。
操作系统在调度进程的时候,会保存被调度进程的上下文环境,等该进程获得时间片后,再恢复该进程的上下文到系统中。
从整个操作系统层面来说,多个进程是可以并发的
并发的价值
-
需要灵敏响应的图像用户界面
-
程序需要执行大量的计算或者
I/O密集操作。需要让响应与运算同时执行 -
Web服务器面对大量用户请求时,需要有更多的“Web服务器工作单元”来分别响应用户 -
事务处于分布式环境上,相同的工作单元在不同的计算机上处理着被分片的数据。计算机的
CPU从单内核(core)向多内核发展,而我们的程序都是串行的,计算机硬件的能力没有得到发挥。 -
程序因为
I/O操作被阻塞,整个程序处于停滞状态,其他I/O无关的任务无法执行。
并发的优势
-
并发能更客观地表现问题模型;
-
并发可以充分利用
CPU核心的优势,提高程序的执行效率; -
并发能充分利用
CPU

浙公网安备 33010602011771号