Go 语言入门很简单 -- 15. Go 并发基础知识 #私藏项目实操分享#

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: Go 语言入门很简单 -- 15. Go 并发基础知识 #私藏项目实操分享#

在操作系统中,进程和线程的执行都具有并发性。

并发是指向一段时间内,多个任务可以共享系统资源,同时执行。

并行是指从某个时刻开始,多个任务同时执行。

image.png

程序的顺序执行

如果在程序中,语句一条语句一条语句顺序排列的,如果系统中只有一个程序,那么程序执行时也是按照程序语句排列先后次序,一条一条地执行下去。这种方式就像工厂生产流水线加工方式那样,这种程序设计方式就叫做顺序程序设计。

在单任务、单处理机系统环境中,内存中只有一道程序作业在执行,一个程序完成后,下一个程序作业才能进入内存继续执行。

这种顺序执行的程序有三个特点:

  • 严格顺序执行。每条程序语句的执行都以前一条语句的结束为前提条件
  • 一个程序在计算机中运行时独占全部系统资源。只有程序本身的动作才能改变程序的运行环境。
  • 程序的执行结果与程序的运行速度无关。即处理机在执行程序任何两条语句之间的停顿,对程序的运算结果不发生影响。

这三个特点概括起来就是程序的封闭性可再现性

封闭性:程序一旦运行起来,其计算结果仅仅取决于程序本身,即运行结果唯一。

可再现性:指同一程序可反复执行,且每次执行结果相同。

程序的并发执行

程序的顺序执行限制系统内存中只有一道程序作业,这显然限制了系统性能的发挥,且资源利用率不高。

现代操作系统都支持程序的并发执行。

所谓并发执行是指在同一时间间隔内,多个程序可以“同时”执行。

在单处理机系统中,进程(或线程)通过时间片或者让出控制权来实现任务切换,以达到“同时”运行多个程序的目的。

这种方式叫做程序并发执行,但实际上任何时刻都只有一个任务被执行,其他任务则通过某个算法来排队准备执行。

即宏观上多个程序任务是“同时”执行,但微观上各任务还是一个一个地顺序执行。

程序的并发执行可以使得多个程序可以共享系统资源,提高系统资源利用率,还可以增加系统吞吐量。

同时,系统的并发执行和资源共享也使得系统环境变得非常复杂,不像顺序执行那么简单。

程序的并发执行基本是由操作系统提供的,Go 在语言层面就支持并发特性。

程序的并行执行

和并发执行不同,程序的并行执行是指同一时刻,多个程序可以同时执行。在多处理机系统中,可以让多个进程,或同一进程内的多个线程做到真正意义上的同时执行,它们之间不需要排队(这是在理想情况下,系统中进程(线程)的数量可能超过处理机的数量,这是依然需要排队)。在这种情况下,多个程序才能达到真正意义上的“同时”执行,即并行执行。

进程的概念

进程是在并发环境下,程序的一次动态执行过程。它由进程控制块(PCB)、程序和数据三部分组成,进程在它的生命周期内可能处于执行、就绪、阻塞三种基本状态。

在多任务操作系统中,多个进程可以并发执行,而且进程是系统资源分配的基本单位。系统中每个进程都有自己的内存映像区,且互不影响,所以管理简单,但缺点是系统开销大。所以,系统能同时创建的进程数量是有限的,不能太多。

线程的概念

由于进程的系统开销大,操作系统的设计者们又提出来更小的独立运行的单位——线程。

通过线程来提高系统内程序并发执行的程度,从而进一步提高系统的吞吐量。

在操作系统中,线程是由进程创建的,所以它继承了进程的部分资源,且具有进程的一些基本特征。所以多个线程之间也可以并发执行,且比进程的系统开销小。

但是,和进程一样,线程依然是由系统内核管理的,所以在高并发情况下,系统能创建的线程数量依然有限,效率也不高。

协程的概念

协程本质上是一种用户态线程,不需要操作系统进行抢占式调度,而且在真正的实现中寄存于线程中。因此,协程系统开销极小,可以有效提高线程任务的并发性,避免高并发模式下线程的缺点。

协程最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而系统最多能创建的进程、线程的数量却少得多。

使用协程的有点是编程简单,结果清晰。但缺点是需要语言的支持,如果语言不支持,则需要用户在程序中自行实现调度。

目前,原生支持协程的语言还很少。

Goroutine

Go 语言在语言级别支持轻量级线程,叫做 Goroutine,Go 语言标准库提供的所有系统调用操作(包括同步I/O操作),都会让出处理机给其他 Goroutine。这使得轻量级线程的切换管理不依赖于系统的进程和线程,也不依赖于 CPU 的核心数量。

相关文章
|
10月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1533 162
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
638 4
|
9月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
699 43
Go语言深度解析:从入门到精通的完整指南
|
JSON 中间件 Go
Go语言实战指南 —— Go中的反射机制:reflect 包使用
Go语言中的反射机制通过`reflect`包实现,允许程序在运行时动态检查变量类型、获取或设置值、调用方法等。它适用于初中级开发者深入理解Go的动态能力,帮助构建通用工具、中间件和ORM系统等。
718 63
|
10月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
【Go语言入门100题】026 I Love GPLT (5 分) Go语言 | Golang
L1-026 I Love GPLT (5 分) Go语言|Golang 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
795 0
|
存储 Go
【Go语言入门100题】023 输出GPLT (20 分) Go语言 | Golang
L1-023 输出GPLT (20 分) Go语言|Golang 给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。 下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
283 0
|
9月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
429 2
|
11月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
654 1
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。

热门文章

最新文章