简介
并发是Go语言最重要的语言特性之一,是Go语言区别于其它语言的重要特征。Go语言原生支持并发,可以充分发挥多核CPU的机器性能,同时在语言层面上,Go以十分简洁的语法提供丰富的并发能力,让并发编程并得简单。本文总结Go语言并发编程的常用模式,模式也就是我们说的套路,先学会模仿,再学会融汇贯通,最后才能创造出新的模式,这就是所谓的无招胜有招吧。
Go对并发的支持
对于桌面客户端应用程序,为了提升客户端的运行效率和简化多线程编程,通常的做法是在客户端启动时,启动三个常驻线程,分别是UI线程,逻辑线程和IO线程。每个线程维护一个事件循环,线程之间通信(数据传输)只能通过消息队列进行传递,消息队列是线程安全。
这么做主要有两个好处,一是常驻线程避免创建和销毁线程的开销,多核情况下,通常没有线程上下文切换,线程运行效率高。二是通过消息队列传递数据,各个线程对数据进行操作时不用所以资源竞争问题,这极大降低了多线程编程的难度,并且设计出的程序也更简单,更容易理解。
接触到Go之后,才知道这种编程模型其实就是C. A. R. Hoare的Communicating Sequential Processes, CSP。Go语言原生支持并发(goroutine)和通道(channel),并且还提供了select对多路通道进行控制,极大简化了并发编程的难度。
接下来,本文将介绍Go并发编程的常用模式。本文并不适合没有Go语言基础的读者,在阅读以下内容前,请先查阅以下内容: