超实用go语言Goroutines, Channels, Panics, 和 Errors的粗略分析

2020-07-09 00:00:00 函数 语言 代码 线程 错误

Golang 对于 DevOps 之利弊(第 1 部分,共 6 部分):Goroutines, Panics 和 Errors

对于你的下一个 DevOps 应用来说,Google 公司的 Go 可能是完美的语言。作为由 6 篇组成一个系列文章的篇,我们从 goroutinespanicserrors 开始深入研究 Go 语言的利与弊,因为这些利与弊涉及构建 DevOps 应用。

对于你的下一个 DevOps 应用来说,Google 公司的 Go 可能是完美的语言。作为由 6 篇组成一个系列文章的篇,我们从 goroutines, panics, and errors 开始深入研究 Go 语言的利与弊,因为这些利与弊涉及构建 DevOps 应用。
在这篇博客中,我们已经称赞了 Google 公司的 Go 语言用于 DevOps 应用开发的优点,而且我们也写了Go 迷你入门指南。 为了避免有人认为我们是打着 DevOps 监控平台幌子的 Google 员工(我们确实是正儿八经 DevOps 监控平台,而不是 Google 员工),我们希望深入研究 Go 语言的优缺点,特别是在涉及构建 DevOps 应用程序方面。由于我们将智能代理(软件)从 Python(构建) 转换到 Go(构建),我们有许多在 Go 语言环境下工作(开发)的经验,并且我们也有一些自认为很重要的东西(知识)来与更大的 DevOps 社区分享。
从这周开始,我们将发布由6 篇组成一系列关于 Go 语言利和弊文章,每一篇文章都详述了少许的内容。正如我们所做的,我们将通过链接到其它篇目来更新这篇文章:

  • Golang 对于 DevOps 之利弊篇:Goroutines, Channels, Panics, and Errors(本篇)
  • Golang 对于 DevOps 之利弊第二篇:自动接口实现,共有/私有变量
  • Golang 对于 DevOps 之利弊第三篇:速度 VS 缺少泛型
  • Golang 对于 DevOps 之利弊第四篇:打包时间与方法重载
  • Golang 对于 DevOps 之利弊第五篇:交叉编译,窗口,信号,文档和编译器
  • Golang 对于 DevOps 之利弊第六篇:Defer 语句和包依赖版本控制

如果这是你阅读有关 Go 的文章,并且你已经知道怎样用类 C 的语言进行编程,你应该去参考Go 语言之旅,它将大约花费你一个小时,而且介绍相当有深度。接下来的内容并不是介绍学习如何用 Go 进行编程,而是我们在用 Go 语言开发智能代理系统过程中有过的抱怨和发现的可取之处。 准备好听听用 Go 进行编程的真正样子吗?我要开始说了(原谅我,这是一个不高明的双关)[译注:原文是 Here it goes,goes 对应 go 语言]。

准备好听听用 Go 进行编程的真正样子吗?我要开始说了(原谅我,这是一个不高明的双关)(译注:原文是 Here it goesgoes 对应 go 语言)。

Go 语言的好处 1: Goroutines — 轻量,内核级线程

Goroutine 等同于 GoGoroutine 是执行线程,并且它是轻量的、内核级的。轻量级是因为你可以在不影响系统性能的同时运行很多的 Goroutine,而内核级是因为它们并行运行(真正的并行运行,而不是像在其他语言中的伪并行,比如旧版的 Ruby)。同时也不像 Python那样,在 Go 中没有全局解释器锁(GIL)。
换句话说,GoroutineGo 语言中的重要部分,而不是后来才添加的特性,这正是 Go 语言执行之快的原因之一。另一方面,Java 有一个复杂的线程调度器。它们在为线程的执行创造条件,但是需要很多的管理工作,因此降低了你的程序运行速度。从另一个角度看,Node.js 没有真正的并发,仅仅是并发的假象。这是对于 DevOps 用途来说,Go 能成为一门伟大的语言的原因,它不影响你的系统性能,真正的并行执行,并且在意外的硬件故障中尽可能的可靠。

怎样执行一个 Goroutine

启动一个 goroutine 线程超级简单。首先,你将在我们的看门go产品中看到一些伪代码:

import "time"
func monitorCpu() { … }
func monitorDisk() { … }
func monitorNetwork() { … }
func monitorProcesses() { … }
func monitorIdentity() { … }

func main() {
    for !shutdown {
        monitorCpu()
        monitorDisk()
        monitorNetwork()
        monitorProcesses()
        monitorIdentity()
        time.Sleep(5*time.Second)
    }
}

相关文章