Go语言并发模式视角思考

在这里插入图片描述

犹记得2019年中旬进行知识点的学习和demo的练习,熟悉各种语法和并发调度的场景,
在2019年末开始参与项目实战开发和逻辑梳理

Go语言的接触也是更多探索和业务的拆件,做一些雏形工具,来慢慢的孵化业务生态

后来陆陆续续,在主营业务是PHP的情况下,尽量在业务脚本的倾向上使用Go语言,虽然前期两种语言的混合使用,总会导致写法冲突,但好在这个磨合期平稳度过。

后来也会将公司更多的业务倾向于Go来进行处理,比如新项目,或者老项目对并发要求高的项目会优先考虑。
罗列下Go语言的特点:

Go主要有静态语言、天生并发、内置GC、安全性高、语法简单、交叉编译和编译快速这几个方面的特性。
这些特性决定了Go的三个高富帅特性:运行快、开发快和部署快,而这些特性都是针对Google遇到的一些痛点来设计的。

优势

  • Go天生的自带并发调度,如协程和通道,且协程内存占用少,一个Goroutine栈空间最小2K
  • Go自带的格式统一,gofmt工具
  • Go语法的简洁,可读性强,严格语言规范
  • Go作为静态语言,编译效率高,性能相对高
  • Go跨平台的编译使用,跟操作shell命令一样的调用,部署方便,目前很多脚本都是这么来做的。
  • 丰富的内置类型,内置强大的工具
  • 内置runtime,自动垃圾回收机制

不足

  • 错误处理,会有错误难获取
  • 基于github获取代码库,会存在有代码库下架问题

Go适合做什么

  • 服务器编程,如:处理日志,数据打包,虚拟机处理,文件系统
  • 分布式系统,数据库代理器
  • 网络编程,如:Web应用、API应用、下载应用
  • 内存数据库
  • 云平台,Docker,Kubernetes等应用开发

GO语言的关键特性主要包括以下几方面:

  • 并发与协程
  • 基于消息传递的通信方式
  • 丰富实用的内置数据类型
  • 函数多返回值
  • defer机制
  • 反射(reflect)
  • 高性能HTTP Server
  • 工程管理
  • 编程规范

Go成功的项目

  • Go成功的项目nsq:bitly开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
  • docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
  • packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
  • skynet:分布式调度框架
  • Doozer:分布式同步工具,类似ZooKeeper
  • Heka:mazila开源的日志处理系统
  • cbfs:couchbase开源的分布式文件系统
  • tsuru:开源的PAAS平台,和SAE实现的功能一模一样
  • groupcache:memcahe作者写的用于Google下载系统的缓存系统
  • god:类似redis的缓存系统,但是支持分布式和扩展性
  • gor:网络流量抓包和重放工具

码云上项目

  • 1、项目名称:基于 Go 实现的高性能代理服务器,项目地址:https://gitee.com/snail/proxy
  • 2、项目名称:基于 Go 实现的 Git 服务,项目地址:https://gitee.com/Unknown/gogs
  • 3、项目名称:基于 Go 开发的开源文库系统,项目地址:https://gitee.com/truthhun/DocHub
  • 4、项目名称:基于 Go 实现的内网穿透 ,项目地址:https://gitee.com/wapai/chuantou
  • 5、项目名称:基于 Go 实现的 Web 开发框架,项目地址:https://gitee.com/johng/gf
  • 6、项目名称:基于 Go 实现的高性能爬虫,基于go_spider开发

接下来介绍下关于Go的并发相关的内容

Go 调度器实现机制

Go 调度器模型我们通常叫做G-P-M 模型,他包括 4 个重要结构,分别是G、P、M、Sched:

G:Goroutine,每个 Goroutine 对应一个 G 结构体,G 存储 Goroutine 的运行堆栈、状态以及任务函数,可重用。
G 并非执行体,每个 G 需要绑定到 P 才能被调度执行。

P: Processor,表示逻辑处理器,对 G 来说,P 相当于 CPU 核,G 只有绑定到 P 才能被调度。
对 M 来说,P 提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等。
P 的数量决定了系统内最大可并行的 G 的数量(前提:物理 CPU 核数 >= P 的数量)。
P 的数量由用户设置的 GoMAXPROCS 决定,但是不论 GoMAXPROCS 设置为多大,P 的数量最大为 256。

M: Machine,OS 内核线程抽象,代表着真正执行计算的资源,在绑定有效的 P 后,进入 schedule 循环;
而 schedule 循环的机制大致是从 Global 队列、P 的 Local 队列以及 wait 队列中获取。
M 的数量是不定的,由 Go Runtime 调整,为了防止创建过多 OS 线程导致系统调度不过来,目前默认最大限制为 10000 个。
M 并不保留 G 状态,这是 G 可以跨 M 调度的基础。

Sched:Go 调度器,它维护有存储 M 和 G 的队列以及调度器的一些状态信息等。
调度器循环的机制大致是从各种队列、P 的本地队列中获取 G,切换到 G 的执行栈上并执行 G 的函数,调用 Goexit 做清理工作并回到 M,如此反复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294044.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

03- OpenCV:矩阵的掩膜操作

目录 1、矩阵的掩膜操作 简介 2、获取图像像素指针 3、掩膜操作解释 4、代码演示 1、矩阵的掩膜操作 简介 在OpenCV中,矩阵的掩膜操作是一种通过使用一个二进制掩膜来选择性地修改或提取图像或矩阵的特定区域的方法。 掩膜是一个与原始图像或矩阵具有相同大小的…

力扣题:高精度运算-1.3

力扣题-1.3 [力扣刷题攻略] Re:从零开始的力扣刷题生活 力扣题1:43. 字符串相乘 解题思想:类似计算时采用的竖式乘法。首先取得num2的低位,并补齐对应的0,然后与num1进行相乘,然后进行字符串的相加操作。…

【萤火虫系列教程】2/5-Adobe Firefly 文字​生成​图像

文字​生成​图像 登录账号后,在主页点击文字生成图像的【生成】按钮,进入到文字生成图像 查看图像 在文字生成图像页面,可以看到别人生成的图像。 点击某个图像,就可以进入图像详情,可以看到文字描述。 生成图像 我…

c++之迭代器

目录 一、迭代器 二、几种常见的迭代器类型 三、使用迭代器时注意事项 一、迭代器 在C中,迭代器是一种用于遍历容器元素的对象。迭代器提供了一种通用的方式来访问各种不同类型的容器,如数组、向量、列表、集合和映射等。 使用迭代器可以避免直接操作…

c++牛客总结

一、c/c语言基础 1、基础 1、指针和引用的区别 指针是一个新的变量,指向另一个变量的地址,我们可以通过这个地址来修改该另一个变量; 引用是一个别名,对引用的操作就是对变量本身进行操作;指针可以有多级 引用只有一…

python股票分析挖掘预测技术指标知识大全(1)

本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包, 我们已经初步的接触与…

leetcode 每日一题 2024年01月01日 经营摩天轮的最大利润

题目 1599 经营摩天轮的最大利润 你正在经营一座摩天轮,该摩天轮共有 4 个座舱 ,每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱,但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 给你…

LeetCode 2487. 从链表中移除节点:单调栈

【LetMeFly】2487.从链表中移除节点:单调栈 力扣题目链接:https://leetcode.cn/problems/remove-nodes-from-linked-list/ 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1: 输…

【RocketMQ每日一问】RocketMQ中raft的应用?

1.rocketmq中raft算法实现方式 RocketMQ 中实现 Raft 算法的模块是 DLedger,它是一种基于 Raft 协议的分布式日志存储模式,用于提供高可用性和数据一致性的保证,保证消息的可靠性和持久化存储。 在 DLedger 中,每个节点都维护着…

IDEA安装教程及使用

一、IDEA简介 ​ IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境:把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 二、ID…

【软件系统架构设计】期末复习题目汇总:简答+应用

电子科技大学软件系统架构设计2023年秋期末考试复习题目汇总 目录 系统分析与设计概述 面向对象建模语言 系统规划 系统需求分析 系统架构设计 软件建模详细设计 设计模式 用户界面设计 系统分析与设计概述 信息系统的 6 种类型,举例说明? 信息…

一个人,2 年时间,每月赚 6w 美金,独立开发者故事丨 RTE 开发者日报 Vol.120

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

探讨芯片封装的技术、工艺以及与之相关的知识

芯片封装作为芯片技术中的重要环节,扮演着保护和连接芯片的关键角色。通过封装工艺,芯片能够与外界进行通信并在实际应用中发挥作用。本文将深入探讨芯片封装的技术、工艺以及与之相关的知识。 芯片封装的概念与意义 芯片封装是指将芯片封装在特定的封…

【算法系列 | 12】深入解析查找算法之—斐波那契查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第12讲,讲…

嵌套调用和链式访问

嵌套调用 嵌套调用就是函数之间的互相调用,每个函数就是⼀个乐高零件,正是因为多个乐高的零件互相无缝的配合才能搭建出精美的乐高玩具,也正是因为函数之间有效的互相调用,最后写出来了相对大型的程序。 假设我们计算某年…

git 回退版本

git 回退版本 1.查看记录 git log 2.如何回退 git reset --hard commit_id commit_id为上面加深的id 3.强制提交 git push origin HEAD --force

中国九大农业区划数据,shp格式,1982年数据,面形式,数据已可视化

中国九大农业区划包含东北平原区 、北方干旱半干旱区 、黄淮海平原区 、黄土高原区 、青藏高原区 、长江中下游地区 、四川盆地及周边地区 、云贵高原区 、华南区,以下为该数据信息: 基本信息. 数据名称: 中国九大农业区划数据 数据格式: Shp 数据…

自动驾驶状态观测1-坡度估计

背景 自动驾驶坡度对纵向的跟踪精度和体感都有一定程度的影响。行车场景虽然一般搭载了GPS和IMU设备,但pitch角一般不准,加速度也存在波动大的特点。泊车场景一般在室内地库,受GPS信号遮挡影响,一般无法获取高程和坡度。搭载昂贵…

更新!又10本期刊被踢,Scopus期刊目录-第九版(附下载)

Scopus概况 Scopus是Elsevier创立于2004年的摘要和引文数据库,同时也是全世界最大的摘要和引文数据库,涵盖了丛书、期刊和行业期刊这三种资源类型。 截止到2023年8月,Scopus期刊目录中共包含期刊44049本。 Scopus与SCIE或SSCI一样&#xf…

conda

一、安装 推荐清华源 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CN&OD选择版本 Miniconda3-py39_4.12.0-MacOSX-arm64.pkg测试命令 conda help二、更换仓库 配置加速 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/没有 .condarc 文件则执行…