引言:如果你在实现一个方案或者处理一件事情之时,若发现方案极其复杂、手段极其繁琐,那请停下来告诉自己:一定有更简单的方案,因为好的东西一定是简单的、美的,如果还没找到,那人类需要继续进化!
go 语言盛行的原因,很大程度因为其天生并发特性,稍后会对比 java 的并发,一起来看下,程序语言确实正在向着极简的方向发展。《大话 go 语言之类型系统》中已经介绍了 go 语言的类型系统特性,go 语言是静态强类型,可以面向过程编程、可 oop、可函数式编程,除了静态类型外,看起来和 python 很像。
python 并发多线程一直被程序员所诟病,主要是全局锁(gl)的存在使得 python 多线程效率并不高,不能充分利用多核 cpc 的优势,这导致python 的并发多进程更流行,相信大家经常会用 multiprocessing,就像这样:
python 多进程
多进程启动后,后台有一堆 python 进程,监控起来不是很方便,多进程的成本较高。
其实 java 的多线程很先进,java 最大的优势在于体系,j2ee 目前在企业级开发方面具有不可替代性,spring hibernate 和各种 apache 以及 google 的库对 java 的传播具有深远影响,maven、gradle 等一众工具将企业级应用的流行提升到了新的高度。
java 多线程的发展经历了几个阶段,早期的基本同步互斥,到后期的 excutor 等,使得java 并发编程的学习成本较高,相信看过《java 并发编程》的人很少看一遍就可以理解其中内容并应用,甚至看几遍也很难在短时间写一个没有 bug 的并发程序。这也是为什么 netty 这种并行框架流行的原因,下图是我曾经学习 java 并发编程时的部分总结,过一段时间就需要回忆一下,但是还会忘记,很多人看到可能就望而却步。
java 并发编程笔记
大而全,java 并发编程是强大,但是对编程人员的要求是很高的,后期的开发和维护,反复测试代价较大。
那么 go 语言是怎么解决这个问题的呢,其实呢 go 语言也是借鉴了 actor 模式,通过发送消息在语言层面替程序员把好关,把比较难的同步部分屏蔽掉,使得程序员可以安心写上层逻辑。下面以一个经典面试题:生产者和消费者为例,来看一下 go 语言实现这个模式需要多少代码:
为方便看包中的内容都放到一个文本中
有效代码30行,可以将生产者和消费者写的很清晰而不出错,这就是『简而美』!
go 语言引入了 goroutine 协程机制,通过 go 关键词加函数就自动启动一个逻辑线程,每个逻辑线程会被调度到物理线程上进行并行执行(根据 cpu 核数),而通道channel 就天生为并发而生,他是一个支持并发读写的结构,可以创建有缓冲区的,也可创建无缓冲区的,通过通道进行通信来实现了 go 语言对于不同 goroutine 的同步和生命周期的管理。
下次会单独分享下『协程』的前世今生,感谢每位读者对『大龄码农』的关注。