正文
go语言编写的虚拟机 go语言编写操作系统
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
GO语言商业案例(十八):stream
切换到新语言始终是一大步,尤其是当您的团队成员只有一个时有该语言的先前经验。现在,Stream 的主要编程语言从 Python 切换到了 Go。这篇文章将解释stream决定放弃 Python 并转向 Go 的一些原因。
Go 非常快。性能类似于 Java 或 C++。对于用例,Go 通常比 Python 快 40 倍。
对于许多应用程序来说,编程语言只是应用程序和数据库之间的粘合剂。语言本身的性能通常并不重要。然而,Stream 是一个API 提供商,为 700 家公司和超过 5 亿最终用户提供提要和聊天平台。多年来,我们一直在优化 Cassandra、PostgreSQL、Redis 等,但最终,您会达到所使用语言的极限。Python 是一门很棒的语言,但对于序列化/反序列化、排名和聚合等用例,它的性能相当缓慢。我们经常遇到性能问题,Cassandra 需要 1 毫秒来检索数据,而 Python 会花费接下来的 10 毫秒将其转换为对象。
看看我如何开始 Go 教程中的一小段 Go 代码。(这是一个很棒的教程,也是学习 Go 的一个很好的起点。)
如果您是 Go 新手,那么在阅读那个小代码片段时不会有太多让您感到惊讶的事情。它展示了多个赋值、数据结构、指针、格式和一个内置的 HTTP 库。当我第一次开始编程时,我一直喜欢使用 Python 更高级的功能。Python 允许您在编写代码时获得相当的创意。例如,您可以:
这些功能玩起来很有趣,但是,正如大多数程序员会同意的那样,在阅读别人的作品时,它们通常会使代码更难理解。Go 迫使你坚持基础。这使得阅读任何人的代码并立即了解发生了什么变得非常容易。 注意:当然,它实际上有多“容易”取决于您的用例。如果你想创建一个基本的 CRUD API,我仍然推荐 Django + DRF或 Rails。
作为一门语言,Go 试图让事情变得简单。它没有引入许多新概念。重点是创建一种非常快速且易于使用的简单语言。它唯一具有创新性的领域是 goroutine 和通道。(100% 正确CSP的概念始于 1977 年,所以这项创新更多是对旧思想的一种新方法。)Goroutines 是 Go 的轻量级线程方法,通道是 goroutines 之间通信的首选方式。Goroutines 的创建非常便宜,并且只需要几 KB 的额外内存。因为 Goroutine 非常轻量,所以有可能同时运行数百甚至数千个。您可以使用通道在 goroutine 之间进行通信。Go 运行时处理所有复杂性。goroutines 和基于通道的并发方法使得使用所有可用的 CPU 内核和处理并发 IO 变得非常容易——所有这些都不会使开发复杂化。与 Python/Java 相比,在 goroutine 上运行函数需要最少的样板代码。您只需在函数调用前加上关键字“go”:
Go 的并发方法很容易使用。与 Node 相比,这是一种有趣的方法,开发人员必须密切关注异步代码的处理方式。Go 中并发的另一个重要方面是竞争检测器。这样可以很容易地确定异步代码中是否存在任何竞争条件。
我们目前用 Go 编写的最大的微服务编译需要 4 秒。与以编译速度慢而闻名的 Java 和 C++ 等语言相比,Go 的快速编译时间是一项重大的生产力胜利。我喜欢在程序编译的时候摸鱼,但在我还记得代码应该做什么的同时完成事情会更好。
首先,让我们从显而易见的开始:与 C++ 和 Java 等旧语言相比,Go 开发人员的数量并不多。根据StackOverflow的数据, 38% 的开发人员知道 Java, 19.3% 的人知道 C++,只有 4.6% 的人知道 Go。GitHub 数据显示了类似的趋势:Go 比 Erlang、Scala 和 Elixir 等语言使用更广泛,但不如 Java 和 C++ 流行。幸运的是,Go 是一种非常简单易学的语言。它提供了您需要的基本功能,仅此而已。它引入的新概念是“延迟”声明和内置的并发管理与“goroutines”和通道。(对于纯粹主义者来说:Go 并不是第一种实现这些概念的语言,只是第一种使它们流行起来的语言。)任何加入团队的 Python、Elixir、C++、Scala 或 Java 开发人员都可以在一个月内在 Go 上发挥作用,因为它的简单性。与许多其他语言相比,我们发现组建 Go 开发人员团队更容易。如果您在博尔德和阿姆斯特丹等竞争激烈的生态系统中招聘人员,这是一项重要的优势。
对于我们这样规模的团队(约 20 人)来说,生态系统很重要。如果您必须重新发明每一个小功能,您根本无法为您的客户创造价值。Go 对我们使用的工具有很好的支持。实体库已经可用于 Redis、RabbitMQ、PostgreSQL、模板解析、任务调度、表达式解析和 RocksDB。与 Rust 或 Elixir 等其他较新的语言相比,Go 的生态系统是一个重大胜利。它当然不如 Java、Python 或 Node 之类的语言好,但它很可靠,而且对于许多基本需求,你会发现已经有高质量的包可用。
Gofmt 是一个很棒的命令行实用程序,内置在 Go 编译器中,用于格式化代码。就功能而言,它与 Python 的 autopep8 非常相似。我们大多数人并不真正喜欢争论制表符与空格。格式的一致性很重要,但实际的格式标准并不那么重要。Gofmt 通过使用一种正式的方式来格式化您的代码来避免所有这些讨论。
Go 对协议缓冲区和 gRPC 具有一流的支持。这两个工具非常适合构建需要通过 RPC 通信的微服务。您只需要编写一个清单,在其中定义可以进行的 RPC 调用以及它们采用的参数。然后从这个清单中自动生成服务器和客户端代码。生成的代码既快速又具有非常小的网络占用空间并且易于使用。从同一个清单中,您甚至可以为许多不同的语言生成客户端代码,例如 C++、Java、Python 和 Ruby。因此,内部流量不再有模棱两可的 REST 端点,您每次都必须编写几乎相同的客户端和服务器代码。.
Go 没有像 Rails 用于 Ruby、Django 用于 Python 或 Laravel 用于 PHP 那样的单一主导框架。这是 Go 社区内激烈争论的话题,因为许多人主张你不应该一开始就使用框架。我完全同意这对于某些用例是正确的。但是,如果有人想构建一个简单的 CRUD API,他们将更容易使用 Django/DJRF、Rails Laravel 或Phoenix。对于 Stream 的用例,我们更喜欢不使用框架。然而,对于许多希望提供简单 CRUD API 的新项目来说,缺乏主导框架将是一个严重的劣势。
Go 通过简单地从函数返回错误并期望调用代码来处理错误(或将其返回到调用堆栈)来处理错误。虽然这种方法有效,但很容易失去问题的范围,以确保您可以向用户提供有意义的错误。错误包通过允许您向错误添加上下文和堆栈跟踪来解决此问题。另一个问题是很容易忘记处理错误。像 errcheck 和 megacheck 这样的静态分析工具可以方便地避免犯这些错误。虽然这些变通办法效果很好,但感觉不太对劲。您希望该语言支持正确的错误处理。
Go 的包管理绝不是完美的。默认情况下,它无法指定特定版本的依赖项,也无法创建可重现的构建。Python、Node 和 Ruby 都有更好的包管理系统。但是,使用正确的工具,Go 的包管理工作得很好。您可以使用Dep来管理您的依赖项,以允许指定和固定版本。除此之外,我们还贡献了一个名为的开源工具VirtualGo,它可以更轻松地处理用 Go 编写的多个项目。
我们进行的一个有趣的实验是在 Python 中使用我们的排名提要功能并在 Go 中重写它。看看这个排名方法的例子:
Python 和 Go 代码都需要执行以下操作来支持这种排名方法:
开发 Python 版本的排名代码大约花了 3 天时间。这包括编写代码、单元测试和文档。接下来,我们花了大约 2 周的时间优化代码。其中一项优化是将分数表达式 (simple_gauss(time)*popularity) 转换为抽象语法树. 我们还实现了缓存逻辑,可以在未来的特定时间预先计算分数。相比之下,开发此代码的 Go 版本大约需要 4 天时间。性能不需要任何进一步的优化。因此,虽然 Python 的最初开发速度更快,但基于 Go 的版本最终需要我们团队的工作量大大减少。另外一个好处是,Go 代码的执行速度比我们高度优化的 Python 代码快大约 40 倍。现在,这只是我们通过切换到 Go 体验到的性能提升的一个示例。
与 Python 相比,我们系统的其他一些组件在 Go 中构建所需的时间要多得多。作为一个总体趋势,我们看到 开发 Go 代码需要更多的努力。但是,我们花更少的时间 优化 代码以提高性能。
我们评估的另一种语言是Elixir.。Elixir 建立在 Erlang 虚拟机之上。这是一种迷人的语言,我们之所以考虑它,是因为我们的一名团队成员在 Erlang 方面拥有丰富的经验。对于我们的用例,我们注意到 Go 的原始性能要好得多。Go 和 Elixir 都可以很好地服务数千个并发请求。但是,如果您查看单个请求的性能,Go 对于我们的用例来说要快得多。我们选择 Go 而不是 Elixir 的另一个原因是生态系统。对于我们需要的组件,Go 有更成熟的库,而在许多情况下,Elixir 库还没有准备好用于生产环境。培训/寻找开发人员使用 Elixir 也更加困难。这些原因使天平向 Go 倾斜。Elixir 的 Phoenix 框架看起来很棒,绝对值得一看。
Go 是一种非常高性能的语言,对并发有很好的支持。它几乎与 C++ 和 Java 等语言一样快。虽然与 Python 或 Ruby 相比,使用 Go 构建东西确实需要更多时间,但您将节省大量用于优化代码的时间。我们在Stream有一个小型开发团队,为超过 5 亿最终用户提供动力和聊天。Go 结合了 强大的生态系统 、新开发人员的 轻松入门、快速的性能 、对并发的 可靠支持和高效的编程环境 ,使其成为一个不错的选择。Stream 仍然在我们的仪表板、站点和机器学习中利用 Python 来提供个性化的订阅源. 我们不会很快与 Python 说再见,但今后所有性能密集型代码都将使用 Go 编写。我们新的聊天 API也完全用 Go 编写。
go语言能做什么?
很多朋友可能知道Go语言的优势在哪,却不知道Go语言适合用于哪些地方。
1、 Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面。Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
2、 其实Go语言主要用作服务器端开发。其定位是用来开发"大型软件"的,适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。
3、 Go语言成功案例。Nsq:Nsq是由Go语言开发的高性能、高可用消息队列系统,性能非常高,每天能处理数十亿条的消息;
4、 Docker:基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。
5、 Packer:用来生成不同平台的镜像文件,例如VM、vbox、AWS等,作者是vagrant的作者
6、 Skynet:分布式调度框架。
7、 Doozer:分布式同步工具,类似ZooKeeper。
8、 Heka:mazila开源的日志处理系统。
9、 Cbfs:couchbase开源的分布式文件系统。
10、 Tsuru:开源的PAAS平台,和SAE实现的功能一模一样。
11、 Groupcache:memcahe作者写的用于Google下载系统的缓存系统。
12、 God:类似redis的缓存系统,但是支持分布式和扩展性。
13、 Gor:网络流量抓包和重放工具。
以上的就是关于go语言能做什么的内容介绍了。
go语言是,运行在虚拟机里的吗?
我们这个世界真的需要另外一种C语言风格的编程语言吗?很显然,谷歌很早就这么认为了,在 2009 年,它借用雷蒙斯乐队的歌“Hey!Ho!Let’s Go”,正式推出了 Go 语言。现在 Go 语言开发团队已经开发出了这种语言的第一个稳定版本,他们称之为 Go 1,他们将这种语言推向世界,希望人们用这种语言“开发出健壮的软件产品和作品。”那么,现在人们对这种语言的使用情况又是如何呢?让我们先回顾一下,什么是 Go 语言,是什么促使谷歌决定推出这样一种语言?按 Go 语言的“常见问题”里的说法,自从那个“重要的系统级编程语言”诞生距今已超过十几年了,这段时间计算机世界已经发生了很大的变化。谷歌的才人们对目前现有的各种语言深感失望,他们必须要在“快速的编译、快速的执行或简单编程”之间做出选择。“没有一种主流的编程语言,例如C,C++,Java,Python 等,能提供谷歌人想要的全部特征。于是,谷歌的工程师从 2007 年起开始开发 Go 语言。“常见问题”里这样说:Go 语言在基本语法上”基本上属于C语言家族“,但它从 Pascal 语系吸收了”大量的理念“,还有一些思想是来自其它的语言。但对于程序员来说,应该把它当成一种全新的语言,一种以”让程序员更有效率,让编程更有效率,至少是让我们更有效率并且使编程更有乐趣“的理念为设计目标的编程语言。Go 语言擅长做什么…?那么,Go 语言擅长做什么?根据谷歌著名的软件工程师——Go 语言的设计人之一——Rob Pike 的说法,它是用来开发”大型软件“的。Pike 说 Go 语言适合于”很多程序员一起开发的大型软件,并且开发周期较长,支持云计算的网络服务:简言之,就是服务端软件。Go 语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。“(作为原贝尔实验室 Unix 开发小组成员,Pike 对系统软件有相当的认识。)但对于其它类型的软件,Go 语言也一样的好用。例如,我在 Google+ 上询问了 Go 语言的使用者,得到了 Douglas Fils 的回复,他正在拿各种语言做实验。Fils 说他现在有时会开发一些 Web 应用程序,大多数都是在 Java 虚拟机(JVM)平台上。“所以 Java 自然是最常用的。我最近开始尝试更多的语言,例如 Scala 和 Groovy。我用 Groovy 语言已经开发了不少的东西,而且刚刚完成了一个 Groovy/Grails 语言上的大型项目。我还研究了一下 Ruby on Rails/Python (Python 框架),并用它们做了一些东西。”他说他用早期版本的 Go 语言开发了一个 Web 界面来处理数据资源。但很不幸。“当时的 Go 的程序库和语法使得开发起来很困难。我还尝试了 node.js,而且,到了一月份,我的精力完全转向了 node.js.”Node.js,Fils 说,很流行,“虽然我很喜欢它,但它的单线程事件循环机制和非阻塞的编程模式让我不太满意。还有,所有的东西都要用 Javascript 的回调函数,我不喜欢这样。”很显然,他不是一个 JavaScript 的粉丝。Go 语言的语法和结构,从另一方面讲,“还是很简洁的。”当Go 语言的语法和结构趋于稳定,并发布了 Go 1 时,他觉得应该转回来,重写他的 Go 语言程序。这回,他想起来了当初为什么想用 Go 来开发。关于Go 语言的争论Fils 说,在 Java 里,很多东西都需要有一定的模板套路,这是很讨厌。他说 Scala 和 groovy 要好一些,但仍然是个问题。Go 语言给人的感觉像一个动态的类型化语言,Fils 说,但 Go 语言里静态类型特征并不像 Java 里那样明显。Go 语言的垃圾收集管理,比 JVM 要好的多。跟 Groovy 这样的动态语言比起来尤其能看出这点。Fils 在评论中说 Go 语言的速度比其它语言快很多倍。它运行速度快但不影响负载量。它编译所需的时间很短,他在开发时能边开发边编译,就像动态语言那样迅速。最后,他说使用 Go 语言要比使用 Node.js,Java 或以 Java 为基础的语言,Ruby on Rails 等语言要有趣的多。在开发 JVM 平台上的应用时,我总感觉自己是一个系统管理员,而不是一个开发者。我要修改堆空间,我要研究负载均衡或内存问题或其它的资源管理问题。而使用 Go 语言,我不需要考虑这些。我开发,编译,测试,运行,部署,非常的享受。请注意,并不是所有的人都喜欢 Go 语言。你可以看一看 Shaneal Manek 的关于 Go 语言的垃圾收集系统以及脚本语言和编译型语言之间比较的评论。Go 语言能走向主流吗?你的期望是什么?按照 RedMonk’s Stephen O’Grady 的说法,对于 Go 语言来说现在还非常年轻。通常,程序员会分成两个阵营:要么欢迎底层语言和脚本型/垃圾收集器型语言的融合,要么是反对这样做。对于后者,毫无意外的,他们是C语言的坚定拥护者。围绕着 Go 语言有很多的争论,这不令人吃惊,任何一种语言都是这样。而令人吃惊的是目前 Go 语言在程序员中获得了相当的吸引力。O’Grady 二月份在 RedMonk 编程语言分级中把 Go 语言放入了第二梯队。但是,他说,考虑一下 Go 语言是如此的年轻,“即使是目前这种成绩也是让人相当的印象深刻了。”谷歌已经发布了 Go 语言的稳定版本,并且在 Google App Engine 支持部署这种语言的应用,这将给 Go 语言带来更多的吸引力。Go 语言能否成为一种“主流”语言,这需要由时间来判定。不过,看起来除谷歌之外还有很多公司对这种语言也很感兴趣,比如 Engine Yard 等公司。那些对目前的现存的语言不太满意的程序员大概对 Go 语言都在拭目以待。如果你在使用 Go 语言或之前简单涉略过它,你需要注意,Go 1 版引入了不少的变化。然而从 Go 1 版开始,Go 语言的变化将会遵循它的规格说明书进行。根据 Go 语言的开发人员的透露,“也许在某个时间,我们会推出 Go 2 的规范,但在此之前,用 Go 语言编写的程序在今后的 Go 1 版本(Go 1.1, Go 1.2 等)上都能正确的运行。”你用Go 语言开发过什么项目吗?
kubernetes 是什么语言开发的
kubernetes是go语言写的,他里面有一些restful api接口,是开源容器应用自动化部署技术,也就是大家经常说的k8s。
kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它,等等...
K8s学习有一个前提条件,需要先掌握docker,如果你没有docker基础的话,那还不能学习 K8s k8s它底层的部署容器的那么容器本来就是docker。
可以看看这个视频教程,还是非常认真仔细的!
使用Go 语言开发大型 MMORPG 游戏服务器怎么样
从2013年起,经朋友推荐开始用Golang编写游戏登陆服务器, 配合C++做第三方平台验证. 到编写独立工具导表工具GitHub - davyxu/tabtoy: 跨平台的高性能便捷电子表格导出器. 以及网络库GitHub - davyxu/cellnet: 简单,方便,高效的Go语言的游戏服务器底层. 最终使用这些工具及库编写整个游戏服务器框架, 我的感受是很不错的
细节看来, 有如下的几个点:
语言, 库
Golang语言特性和C很像, 简单, 一张A4纸就能写完所有特性. go语言编写的虚拟机你想想看, C++到了领悟阶段, 也只用那几个简单特性, 剩下的都是一大堆解决各种内存问题的技巧. 而Golang一开始就简单, 何必浪费生命去研究那一大堆的奇技淫巧呢?
Golang的坑只有2个:1. interface{}和nil配合使用, 2. for循环时, 将循环变量引入闭包(Golang, Lua, C#闭包变量捕获差异) 完全不影响正常使用, 复合语言概念, 只是看官方后面怎么有效的避免
用Golang就忘记继承那套东西, 用组合+接口
用Golang服务器如何保证解决游戏服务器存盘一致性问题? stop the world是肯定的, 但是Golang可以从语言层并发序列化玩家数据, 再通过后台存盘
channel是goroutine虽然是Golang的语言特性. 但是在编写服务器时, 其实只有底层用的比较多.
Golang的第三方库简直多如牛毛, 好的也很多
不要说模板了, C#的也不好用, 官方在纠结也不要加, 使用中, 没模板确实有点不方便. 用interface{}/反射做泛型对于Golang这种强类型语言来说,还是有点打脸
运行期
Golang和C++比性能的话, 这是C++的优势, Golang因为没虚拟机, 只有薄薄的一层调度层. 因此性能是非常高的, 用一点性能牺牲换开发效率, 妥妥的
1.6版后的GC优化的已经很好了, 如果你不是高性能,高并发Web应用, 非要找出一堆的优化技巧的话. 只用Golang写点游戏服务器, 那点GC损耗可以忽略不计
和其go语言编写的虚拟机他现代语言一样, 崩溃捕捉是标配功能, 我用Golang的服务器线上跑, 基本没碰到过崩溃情况
热更新: 官方已经有plugin系统的提交, 跨平台的. 估计很快就可以告别手动cgo做so热更新
开发, 调试, 部署, 优化
LiteIDE是我首选的Golang的IDE, 虽然有童鞋说B格不高. 但这估计实在是找不到缺点说了, 别跟我说Visual Studio, 那是宇宙级的...
曾经听说有人不看好Golang, 我问为啥: 说这么新的语言, 不好招人,后面打听到他是个策划... 好吧
真实情况是这样的: Golang对于有点编程基础的新人来说, 1周左右可以开始贡献代码. 老司机2~3天.
开发效率还是不错的, 一般大的游戏功能, 2*2人一周3~4个整完. 这换C++时代, 大概也就1~2个还写不完. 对接服务器sdk的话, 大概1天接个10多个没问题
Golang自带性能调优工具, 从内存, CPU, 阻塞点等几个方面直接出图进行分析, 非常直观, 可以参考我博客几年前的分析: 使用Golang进行性能分析(Profiling)
Golang支持交叉编译, 跨平台部署, 什么概念? linux是吧? 不问你什么版本, 直接windows上编译输出一个elf, 甩到服务器上开跑.不超过1分钟时间..
使用Go 语言开发大型 MMORPG 游戏伺服器怎么样
使用Go 语言开发大型 MMORPG 游戏伺服器怎么样
如果是大型网路游戏go语言编写的虚拟机的话go语言编写的虚拟机,我觉得是不合适的。现阶段go语言的执行效率还是太低go语言编写的虚拟机了。在底层编译器的优化方面做得和c++相比还是差了不少。go语言也是比较适合快速开发的专案比较合适
从2013年起,经朋友推荐开始用Golang编写游戏登陆伺服器, 配合C++做第三方平台验证. 到编写独立工具导表工具GitHub - davyxu/tabtoy: 跨平台的高效能便捷电子表格汇出器. 以及网路库GitHub - davyxu/cell: 简单,方便,高效的Go语言的游戏伺服器底层. 最终使用这些工具及库编写整个游戏伺服器框架, 我的感受是很不错的
细节看来, 有如下的几个点:
语言, 库
Golang语言特性和C很像, 简单, 一张A4纸就能写完所有特性. go语言编写的虚拟机你想想看, C++到了领悟阶段, 也只用那几个简单特性, 剩下的都是一大堆解决各种记忆体问题的技巧. 而Golang一开始就简单, 何必浪费生命去研究那一大堆的奇技淫巧呢?
Golang的坑只有2个:1. interface{}和nil配合使用, 2. for回圈时, 将回圈变数引入闭包(Golang, Lua, C#闭包变数捕获差异) 完全不影响正常使用, 复合语言概念, 只是看官方后面怎么有效的避免
用Golang就忘记继承那套东西, 用组合+介面
用Golang伺服器如何保证解决游戏伺服器存档一致性问题? s the world是肯定的, 但是Golang可以从语言层并发序列化玩家资料, 再通过后台存档
channel是goroutine虽然是Golang的语言特性. 但是在编写伺服器时, 其实只有底层用的比较多.
Golang的第三方库简直多如牛毛, 好的也很多
不要说模板了, C#的也不好用, 官方在纠结也不要加, 使用中, 没模板确实有点不方便. 用interface{}/反射做泛型对于Golang这种强型别语言来说,还是有点打脸
执行期
Golang和C++比效能的话, 这是C++的优势, Golang因为没虚拟机器, 只有薄薄的一层排程层. 因此效能是非常高的, 用一点效能牺牲换开发效率, 妥妥的
1.6版后的GC优化的已经很好了, 如果你不是高效能,高并发Web应用, 非要找出一堆的优化技巧的话. 只用Golang写点游戏伺服器, 那点GC损耗可以忽略不计
和其他现代语言一样, 崩溃捕捉是标配功能, 我用Golang的伺服器线上跑, 基本没碰到过崩溃情况
热更新: 官方已经有plugin系统的提交, 跨平台的. 估计很快就可以告别手动cgo做so热更新
开发, 除错, 部署, 优化
LiteIDE是我首选的Golang的IDE, 虽然有童鞋说B格不高. 但这估计实在是找不到缺点说了, 别跟我说Visual Studio, 那是宇宙级的...
曾经听说有人不看好Golang, 我问为啥: 说这么新的语言, 不好招人,后面打听到他是个策划... 好吧
真实情况是这样的: Golang对于有点程式设计基础的新人来说, 1周左右可以开始贡献程式码. 老司机2~3天.
开发效率还是不错的, 一般大的游戏功能, 2*2人一周3~4个整完. 这换C++时代, 大概也就1~2个还写不完. 对接伺服器sdk的话, 大概1天接个10多个没问题
Golang自带效能调优工具, 从记忆体, CPU, 阻塞点等几个方面直接出图进行分析, 非常直观, 可以参考我部落格几年前的分析: 使用Golang进行效能分析(Profiling)
Golang支 *** 叉编译, 跨平台部署, 什么概念? linux是吧? 不问你什么版本, 直接windows上编译输出一个elf, 甩到伺服器上开跑.不超过1分钟时间..
1.为什么golang的开发效率高?
golang是一编译型的强型别语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程式设计师因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。
它有自己的包管理机制,工具链成熟,从开发、除错到释出都很简单方便go语言编写的虚拟机;
有反向介面、defer、coroutine等大量的syntactic sugar;
编译速度快,因为是强型别语言又有gc,只要通过编译,非业务毛病就很少了;
它在语法级别上支援了goroutine,这是大家说到最多的内容,这里重点提一下。首先,coroutine并不稀罕,语言并不能超越硬体、作业系统实现神乎其神的功能。golang可以做到事情,其他语言也可以做到,譬如c++,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心)。golang做的事情,是把这一套东西的使用过程简化了,并且提供了一套channel的通讯模式,使得程式设计师可以忽略诸如死锁等问题。
goroutine的目的是描述并发程式设计模型。并发与并行不同,它并不需要多核的硬体支援,它不是一种物理执行状态,而是一种程式逻辑流程。它的主要目的不是利用多核提高执行效率,而是提供一种更容易理解、不容易出错的语言来描述问题。
实际上golang预设就是执行在单OS程序上面的,通过指定环境变数GOMAXPROCS才能转身跑在多OS程序上面。有人提到了网易的pomelo,开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏伺服器的人,都是真正的勇士 : ) 。
2、Erlang与Golang的coroutine有啥区别,coroutine是啥?
coroutine本质上是语言开发者自己实现的、处于user space内的执行绪,无论是erlang、还是golang都是这样。需要解决没有时钟中断;碰著阻塞式i\o,整个程序都会被作业系统主动挂起;需要自己拥有排程控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题。那为啥要废老大的劲自己做一套执行绪放user space里面呢?
并发是伺服器语言必须要解决的问题;
system space的程序还有执行绪排程都太慢了、占用的空间也太大了。
把执行绪放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,执行绪本身以及切换等操作可以做得非常的轻量。这也就是golang这类语言反复提及的超高并发能力,分分钟给你开上几千个执行绪不费力。
不同的是,golang的并发排程在i/o等易发阻塞的时候才会发生,一般是内封在库函式内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction,一旦到点,立即切换排程函式。
中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力,而golang则是cooperative shceduling的。golang一旦写出纯计算死回圈,程序内所有会话必死无疑;要有大计算量少i\o的函式还得自己主动叫runtime.Sched()来进行排程切换。
3、golang的执行效率怎么样?
我是相当反感所谓的ping\pong式benchmark,执行效率需要放到具体的工作环境下面考虑。
首先,它再快也是快不过c的,毕竟底下做了那么多工作,又有排程,又有gc什么的。那为什么在那些benchmark里面,golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了,响应快是因为大量非阻塞式i\o操作出现的原因。这一点c也可以做到,并且能力更强,但是得多写不少优质程式码。
然后,针对游戏伺服器这种高实时性的执行环境,GC所造成的跳帧问题确实比较麻烦,前面的大神 @达达 有比较详细的论述和缓解方案,就不累述了 。随着golang的持续开发,相信应该会有非常大的改进。一是遮蔽记忆体操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC演算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗。
用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的,硬体已经很便宜了,人生苦短,让自己的生活更轻松一点吧: )。
4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的。
如果跟C语言比,大部分指令码都胜出啊。Go, Node.js, Python ......
网易弄过一个Node.js的开源伺服器框架。
至于IDE, 不重要,做伺服器开发很少会要开着IDE除错的。最常用的手段就是打Log. 设定了断点也很难调,多个客户端并发。
那种单客户端连线进来就可以重现的bug倒是可以用IDE调,但是这种bug本来就容易解决。
用指令码语言,有一个很大的好处是容易做自动测试,可以更好地保证程式码质量。
--------------------------
开发效率当然是指令码高。执行效率,其实更重要的是并发,框架合理的话增加机器就可以直接提高效率增加人数。
用Go开发大型mmorpg服务端不会有问题的,如果掉坑里肯定不会是语言的问题。
唯一比较可能掉进去的坑就只有GC,其实很容易预防和调整的,具体细节可以看我部落格分享的文章。
但是技术选型不只是选语言,如果当时我手头有一套效能满意,开发效率OK,人员补给不会有问题的技术方案,不管是什么语言的,我肯定不会放弃它而选择冒险的。
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==xinjian)
{
text.setText("");
}
if(e.getSource()==dakai)
{
openFD.show();
String s;
go语言编写的虚拟机的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言编写操作系统、go语言编写的虚拟机的信息别忘了在本站进行查找喔。