Go语言运行时与自家平台对比后认识

引子

以前就了解Go语言,因为其天生为并发、并行而生,且在语言层面就进行了内秉设计。

总想对比于我们自研的分布式并发、并行平台,以利于得到一些新认识 :)

Go官网资料

Go的官网资料提供了很好的资料和知识库

  • 初学者园地Tour
  • 必读必学的建议编程规范effective_go
  • 博客,例如,介绍其语言设计思想的declaration-syntax。
  • 博客,例如,介绍依赖通信进行共享Share Memory By Communicating

并发并行的CAP(Communicating Sequential Processes)基础理论

  • Brief
  • Tony Hoare’s pdf

总的来说,CAP建议通过管道进行共享信息,以利用并发、并行协作,并建议提供成为语言基础构件,以便于替换共享内存同步原语,例如,mutexsemphore

并发与并行的关系

这两个概念紧密相关,但是,又有区分。

我们可以设想在多进程使用场景,并发与并行的概念就比较好区分。

在一个CPU的情况下,多进程仅能并发、但并不能并行。

如果非要说到并行,只是因为CPU运算速度够快,并行概念仅是粗粒度,或者说比较高级层面呈现的假象!

对于底层CPU层面是无并行的!

但,在多核CPU的情况下,多进程既可以做到并发、又可以做到一定程度的并行。

如果熟悉操作系统概念的同学,用进程调度的术语来讲,进程并发就是意味着多个进程都进入了就绪态。

鼓励CSP编程的口号

借用Go语言官网上总结的口号

Go encourages a different approach in which shared values are passed around on channels and, in fact, never actively shared by separate
threads of execution. Only one goroutine has access to the value at any given time. Data races cannot occur, by design. To encourage this
way of thinking we have reduced it to a slogan:

Do not communicate by sharing memory; instead, share memory by communicating.


不成熟的翻译

Go 鼓励使用一种不同方式,通过通道来传递共享值,以永久避免不同的线程进行共享竞争。
在任何时间,仅有一个协程可以访问(读、写)此值,所以,数据之间的竞争,从设计上不能发生。
为了简化此种思考方式的转变,我们概括它成为一句口号:

不要用共享内存进行协作,但是,共享内存通过生产者和消费者的通信进行

Go的优势

Go语言根据CSP并发、并行理论,在语言层面提供了goroutinechannel作为基础构件,使得在其它语言必须直面线程进行编程模式,可以有另外一条轻便的路径选择!

因为,多线程编程是困难的,易错的!

我觉得选择Go语言来解决项目中并发、并行问题,可以有以下优势:

  • 降低了解决并发、并行问题的难度,提供了基础构件作为代码粒度划分的利器

    • goroutine在多核间的分布调度问题,无需开发者主动介入。由Go运行时高效保证,避免忙的忙死、闲的闲死,并可弹性伸缩
    • 有效避免了多线程编程的线程管理、线程间死锁、线程忙闲不均等问复杂问题
  • 提供了现代编程语言具有的特性,例如,模块、包机制、闭包、函数编程、接口、泛型、类型自动推导等,方便高效编码

  • 跨平台能力

Go语言goroutine编程建议

对于CPU执行的任务,我们知道一般分为两种,一种为CPU密集型任务,另一种是IO密集型任务

对于IO密集型任务,如果采用异步策略后,实际上也可以看做近似的CPU密集型任务,仅有Reactor,或Proactor组件存在IO密集型任务的工作特点。

goroutine编程建议:

  • goroutine仅做CPU密集型任务,保证任务高速、高效
  • goroutine仅访问自身、排它资源;需要共享信息,通过channel通信进行协作

虽然Go语言同时提供了同步包,以用于减少通过channel机制的overhead,
但,我觉得有点鸡肋!
原因如下:

  • 其破坏了语言并发、并行模型,
  • 存在程序员过早优化,或过度优化的嫌疑,而非拥有充足证据后,才进行的懒惰式优化。

猜测来看,同步包会带来Go运行时为精细化goroutine分布调度,而引入的新overhead

回到源头

对比于自研的平台系统,自研平台预先确定了JOB的并行的分布模型,并不具备弹性管理能力,但核心上并发、并行思想接近于CSP,利用JOB间消息通信进行。

对于领域内非通用应用,自研平台够用,且实用!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux 1 关于嵌入式 C 开发人员1.1 嵌入式 C 开发人员必须具备的一些基本技能是:1.2 嵌入式C开发的应用案例 2 如何学习用于嵌入式系统的 Linux2.1 如何学习Linux2.1.1 第一步:创建…

漏刻有时百度地图API实战开发(12)(切片工具的使用、添加自定义图层TileLayer)

TileLayer向地图中添加自定义图层 var tileLayer new BMap.TileLayer();tileLayer.getTilesUrl function (tileCoord, zoom) {var x tileCoord.x;var y tileCoord.y;return images/tiles/ zoom /tile- x _ y .png;}var lockMap new BMap.MapType(lock_map, tileLaye…

【MySQL】MySQL 在 Centos 7环境安装教程

文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源,对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…

【StarRocks-1.简介】

一、简介: starRocks起源于开源软件Doris,其相对Doris的社区环境,starRcoks有商业团队维护、快速版本迭代和dockerHub高支持,让我在生产环境中更加偏向于starRocks,而不是拥抱Doris开源社区。StarRocks的版本更新速度、学习文档和论坛都让小白更加容易入…

Spring+Mybatis如何处理大批量sql(for循环+批处理法)

如果只是单纯地将Mapper语句放在循环中,那么会为每次的循环都创建一个事务,导致大批量的sql耗时会很长。 如果我们让在同一个循环中的Mapper语句在一个事务中提交,批处理这些sql,不多次创建事务,那么我们就能极大地改…

js 获取当前href

在JavaScript中,你可以通过window.location.href来获取当前页面的URL。下面是一个简单的例子: var currentURL window.location.href; console.log(currentURL);上述代码获取当前页面的完整URL,并将其存储在currentURL变量中。然后&#xf…

C语言定长数组 变长数组 柔性数组

C语言定长数组 变长数组 柔性数组 文章目录 C语言定长数组 变长数组 柔性数组1. 定长数组2. 变长数组3. 柔性数组3.1 结构体的大小3.2 柔性数组的使用 1. 定长数组 在C99标准之前,C语言在创建数组的时候,数组的大小只能使用常量,常量表达式来…

【EI会议征稿】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024) 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议(…

小狐狸GPT付费2.4.9弹窗版学习源码介绍

小狐狸GPT付费2.4.9弹窗版学习源码是一套基于GPT(Generative Pre-trained Transformer)模型的开源代码库,旨在帮助开发者快速构建和训练自己的语言模型。该源码集成了多个先进的自然语言处理技术,包括预训练、微调、对话生成等&am…

云服务领取证书,注册域名,实现nginx服务配置证书

目录 1.登录网址腾讯云 2.腾讯云注册域名 3.实名认证,上传信息 4.域名注册 5.领取证书 6.域名与证书绑定 7.下载证书 8.设置环境 9.域名解析 10. 本地域名解析 11.上传证书到目录 12.nginx配置文件做地址重写到证书域名 13.配置证书conf 14.设置index…

磁盘坏道修复工具-是一款非常方便实用的磁盘坏道修复软件-供大家学习研究参考

1、支持磁盘数据擦除。 2、杜绝因硬盘坏道,而产生个人隐私数据泄露的问题。 3、支持对该磁盘格式化。 下载:https://download.csdn.net/download/weixin_43097956/88625682

JavaScript自执行函数:用途、好处

JavaScript中的自执行函数是一个常见的编程技巧,它可以在特定的场景中发挥重要作用。本文将介绍自执行函数的用途、好处,并提供代码示例进行说明。 引言 在JavaScript编程中,自执行函数是一种特殊的函数调用方式,它能够在定义后…

Python中的列表推导式

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式: (1)生成指定范围的数值列表,语法格式如下: list[Expression for var in range] …

【贪心】LeetCode-406. 根据身高重建队列

406. 根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新…

关于“Python”的核心知识点整理大全22

目录 ​编辑 9.4.2 在一个模块中存储多个类 虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的 类。类Battery和ElectricCar都可帮助模拟汽车,因此下面将它们都加入模块car.py中: car.py my_electric_car…

焦虑,其实是你自愿选择的

如果一个人想要焦虑,他可以永远焦虑下去 从上学,到找工作,从买房到结婚生娃,他总是可以选择用自己的头脑去过度思考未来还没有发生的事情,从而让自己无限焦虑下去,直到生命终结。 我们的生命是存在于当下…

技术点:实现大文件上传

大文件上传 实现思路 对于大文件上传考虑到上传时间太久、超出浏览器响应时间、提高上传效率、优化上传用户体验等问题进行了深入探讨,以下初略罗列各个知识点的实现思路: 大文件上传对文件本身进行了文件流内容 Blob 的分割,使用 Blob.pr…

基于 Gin 的 HTTP 代理上网行为记录 demo

前言: 前端时间写了好几篇使用 Gin 框架来做 HTTP 代理 demo 的文章,然后就想着做一个记录上网行为的小工具,就是简单记录看看平时访问了什么网站(基于隧道代理的,不是中间人代理,所以只能记录去了哪里,不能…

wps左上角有绿色小三角的数字如何求和

1.这个状态是求和不了的,使用求和公式求出来的也是0 2.进行如下操作 3.转换好后 则可以求和成功了

使用JavaScript转换图片格式

我们可以在现代浏览器中直接转换图片和格式&#xff0c;不需要上传服务器或者使用服务器脚本。 HTML <!-- 文件上传控件 --> <input type"file" id"fileInput" accept"image/*" /><!-- 输出格式选择 --> <select id"…