热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golangwindos和linux文件_给前端的Golang介绍

现如今Golang在后端大火,介绍Golang的文章层出不穷,然而,很少有能跳出职能划分,从新的角度看待Golang的文章&
e1038814b85e12d550eb0ab26a1dd7c0.png

现如今Golang在后端大火,介绍Golang的文章层出不穷,然而,很少有能跳出职能划分,从新的角度看待Golang的文章,既然如此,小的可以不自量力,来试一试了

首先,为什么要站在前端的角度考虑Golang呢?

因为Golang的原生异步并发能力

这和前端有什么关系?

先不急,我们来看一个例子:

const

这是一段 React 代码,那么我们再来看一段:

var

这是一段Golang代码,有没有感觉?

我们先抛开为什么这两段代码在逻辑上神似的问题(顺便忽略未close的deadlock),先来了解一下后端异步的问题


传统单机后端,并不需要异步,甚至并不存在异步

为何如此说?

以 Nodejs 为例,什么时候会用到异步呢?

ReadFile?WriteFile?createReadFileStream?

现实是,很多时候大家直接写作:

const

而不会去写这样的代码:

const

就这还是 Promise 化流的结果

当年Nodejs在被创作出来的时候,作者即表示,js是很适合用来做ev的语言

话说?为什么是js?或者说,为什么是在前端使用的语言,适合用来做并发和异步?

因为并发,异步,在前端无处不在

低头看看你的无冲键盘,看看你的高刷新率鼠标和屏幕,再打开调试工具,看看请求的等待时间

是不是到处都是异步?

传统后端呢?

并没有大量异步的存在,长期以来,后端都是以会话为单位编程,以flask为例:

def

编程过程只存在一次请求中

那么问题来了:

  1. 针对会话分发,请求分发的异步并发处理
  2. 针对文件操作,请求操作的异步并发处理

哪一个效率更高呢?

500个请求来了,我是用nginx之类的工具做负载好呢?还是要精细到每一个文件,请求,等可能造成堵塞的方法去做优化呢?

即便是支持异步的框架,比如tornado和nodejs,很多时候你也用不到异步,比如Tornado,只在全局声明一次 eventloop 就给了你每个请求的高并发能力

局限在单次请求过程中编程,异步很多时候是困扰,并不会给你带来效率上的提升

即便你写出了:await readFile() 之类的代码,这实际上也是同步的,它与 readFileSync() 这样的代码并没有太大的区别

Nodejs 作者反对 Promise 也是这个原因,在事件驱动模式下,流才是正解


话说,异步为什么会是问题呢?

首先要知道什么是异步?

异步就是不同步,asynchronous 就是 not synchronous,同步指的是,你需要的数据就是当前的版本,异步指的是,你需要的数据不是当前版本,甚至早版本

就拿请求来说,数据库有个数据是:a = 100,前端的用户将a用键盘修改为 200,那么,输入框中的数据和后台接收到的数据就不同

不同就需要处理为相同,异步需要处理为同步

例如 python future await,或者 js async await 的处理方式就很自然出现了,然而这还不够,因为类似鼠标移动,键盘输入等事件,并不是只有一次返回,这种只有开始和结束状态的逻辑,无法处理所有异步的情况

很多人很自然想到:

在内存中开辟一个空间,所有线程,进程,网络,使用这个空间不就可以了?

这种思想可以称为单一数据源思想 —— 当我们只有一份数据可以修改,就不存在数据版本异步的问题

当然,普通人想得到的,基础设施(例如linux)的建设者们早就想到了,这种方案被称为——

共享内存

而使用共享内存作为异步通讯机制,称为

共享内存异步通讯

然而,共享内存通讯是非常复杂的,很多人会说,不就是开辟单独的内存空间么,有什么难的?

但是类似文件操作,网络操作等,都是操作系统的工作,如果应用和操作系统内核共享同一段内存,那这个系统的安全性,可靠性就基本爆炸了

所以,共享内存会存在用户态和内核态两种状态,内核态时,只有内核可以操作,用户态时,应用可以进行读写

除此之外,写入读写的并发问题,哲学家吃饭问题,都是处理异步过程中的烦恼

为了解决这些问题,有很多异步机制被提出来,比如poll,epoll模型等

而linux从内核层次支撑了这一部分:

5aa68dd05660e22940528fa879869752.png

以一个4g的linux系统的内存为例,除了头尾的部分,中间出现了堆区和栈区

而二者的中间,出现了一段“内存映射片段”:

内存映射&#xff0c;就是将用户空间的一段内存区域映射到内核空间&#xff0c;映射成功后&#xff0c;用户对这段内存区域的修改可以直接反映到内核空间&#xff0c;同样&#xff0c;内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。
799cfcd73edcc6651704491064af83f5.png

而网关&#xff0c;文件之类资源&#xff0c;可以用文件描述符&#xff08;fs&#xff09;进行访问

因此&#xff0c;可以实现内核与应用&#xff0c;应用与应用&#xff0c;线程间&#xff0c;进程间甚至是计算机与计算机之间的高效异步

相信前端程序员们已经发现了自己熟悉的堆栈&#xff0c;类似复杂数据存在堆中&#xff0c;简单数据存在栈中之类的描述

正常来说&#xff0c;这种异步方案人们会很自然地用事件驱动模式来思考&#xff0c;即&#xff0c;先后逻辑顺序&#xff0c;毕竟中间内核处理的时间&#xff0c;其他计算单元是无法介入的

然而&#xff0c;利用一些方法&#xff0c;是可以使用 响应式数据驱动 的模式思考同样一个问题的

如果只是简单的将内存划分为堆栈&#43;mmap&#xff0c;确实只能机械地按照一个个方法处理异步逻辑&#xff0c;这种方法的集合就是 “

然而&#xff0c;类似TCMalloc等工具&#xff0c;通过更加精细的内存管理&#xff0c;彻底改变了这一点&#xff1a;

92db5b4e53f88748c4e3472b22b73c39.png

通过精细化的封装&#xff0c;实现这样的数据驱动高并发异步是可能的&#xff1a;

React 通过 FiberNode 精细化浏览器异步调度

同样 Golang 也是利用类似这样的思想

因此&#xff0c;留给大家的就是 Go程 &#43; 通道&#xff1a;

// 一个通道

不难找到这些方案和前端在 React 等框架中大量使用的 hooks&#xff0c;service 等思想

但是&#xff0c;以 React 为例&#xff0c;useState() 的状态是单一的&#xff0c;而 Golang 的 chan 状态并非是单一的&#xff1a;

var

这是有两个缓存的 channel&#xff0c;你答应第几个&#xff0c;它就是第几个数据&#xff0c;这种模式有点类似与 generator 方案&#xff0c;然而控制数据异步的仅仅是数据源&#xff0c;并非 xxx.next


Golang的三位作者之一&#xff0c;同时也是Javascript V8引擎的作者&#xff0c;相信前端从业者会从很多api的使用上找到亲切感

Golang现在市场比较火热&#xff0c;我之前有篇文章提到过前端应该如何反内卷&#xff0c;有一条解决方案便是去更好的市场&#xff0c;更有议价权的市场中试试看&#xff0c;Golang也是一个很好的方案

千万不要提全栈&#xff0c;全栈是内卷得不能再内卷的自轻自贱



推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 构建LNMP架构平台
    LNMP架构的组成:Linux、Nginx、MySQL、PHP关于NginxNginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgorsysoev开发,其特点是 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文详细介绍了cisco路由器IOS损坏时的恢复方法,包括进入ROMMON模式、设置IP地址、子网掩码、默认网关以及使用TFTP服务器传输IOS文件的步骤。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • nginx 反向代理proxy参数讲解
    ![](http:i2.51cto.comimagesblog20180805c32a728954d93ee2a4e4fb59c150a15b.png?x-oss-processi ... [详细]
author-avatar
看是语言_263
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有