初识Golang协程

最近看一些Go相关的项目,原来有学一些基础的语法,但是看到了一个完璧的项目时是远远不够的。Go这门语言本身就给我提好了完整的生态链条不需要去装备一些插件,开箱即用的一门语言,并且能直接编译成机器码在不同型号的架构和操作系统下运行,虽然Go也是一门JVM语言但是Go在运行时并不一定要依赖于JVM,更加贴切与云原生,并且Go也有拿得出手的项目,比如说k8s,普罗米修斯这些顶级开源项目,各个都是在不同领域遥遥领先,所以说还等什么,到时候时代完全变了就来不及了。
这并不是诱导学习这门语言,的确这门语言很优秀的,对比于Java虽然说Java在新版本下也支持AOT技术来运行但是还是有非常多的问题,那么Java这门语言其实是依赖spring的生态的,但是spring的框架都是基于ioc和aop的这些技术背后都是用到了反射和代理技术,这些技术背后就是动态字节码,这些class字节码文件依赖于jvm来动态解释的,所以说真正的脱离JVM暂时是不可能的,只要是云原生这个方向发展的越好,其他不支持的语言就会容易被淘汰。
不管怎么样一切还是得有需求才会有这门语言的发挥空间,现如今在国内的环境普遍都是用的Java,一些银行的项目提供的sdk都是只有Java的,所以说,一是供给大于需求,二是项目整体的架构更替也是需要时间的,现在行情问题,大部分企业可能能用就行,优化只是留给有需求和还存在盈利的企业,算了不说了说多无益,我们开始对Go的协程有一个简单了解吧。

Go 通常被描述为一种并发友好的语言。原因是它提供了两种强大机制的简单语法: 协程 和 通道

协程

协程 类似于一个线程,但是由 Go 而不是操作系统预定。在 协程 中运行的代码可以与其他代码同时运行。我们来看一个例子:

package main

import (
  "fmt"
  "time"
)

func main() {
  fmt.Println("start")
  go process()
  time.Sleep(time.Millisecond * 10)
  fmt.Println("done")
}

func process() {
  fmt.Println("processing")
}

这里有一些有趣的事情, 但最重要的是我们如何开始一个 协程 。我们只需使用 go 关键字,然后使用我们想要执行的函数。如果我们只想运行一部分代码, 如上所述, 我们可以使用匿名函数。需要注意的是,匿名函数不只是可以在 协程 中使用,其他地方也可以。

go func() {
  fmt.Println("processing")
}()

协程 易于创建且开销很小。最终多个 协程 将会在同一个底层的操作系统线程上运行。这通常也称为 M:N 线程模型,因为我们有 M 个应用线程( 协程 )运行在 N 个操作系统线程上。结果就是,一个 协程 的开销和系统线程比起来相对很低(几 KB)。在现代的硬件上,有可能拥有数百万个 协程 。

此外,这里还隐藏了映射和调度的复杂性。我们只需要说 这段代码需要同时并发执行 然后让 Go 自己去实现它。

如果我们回到我们的例子中,你将会注意到我们使用 Sleep 让程序等了几毫秒。这是因为主进程在退出前 协程 才会有机会去执行(主进程在退出前不会等待全部 协程 执行完毕)。要解决这个问题,我们需要协调我们的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值