所谓夹带私货,就是第一篇看上去很客观,第二篇隐约指出Go语言是一门好语言,这第三篇,完全是讲Go语言编程,不关心的读者可以忽略。

   上一篇我们说到Erlang是适应多核编程的语言,因为

   1.进程间不共享内存

   2.进程间使用消息通讯

   3.不使用锁

   其中,不使用锁,是因为进程间不共享内存,每个进程内部的操作都是串行的,不会有并发冲突。在这个方面,所有支持共享内存的语言都可以写成内存不共享,从而避免使用锁。那么如果一定要共享内存的场景怎么办,比如我们之前提起过的缓存服务,希望能利用多进程来提高吞吐能力,提高同一块内存的利用率。

   如果是java,就一定要加锁,一个进程写的时候,不允许其它进程写,我是有加锁恐惧症,想到加锁就会害怕。

   好在go语言有管道(channel)这个选择,借鉴Erlang的思想,我们创建一个进程(goroutine),假装拥有了整个缓存的内存块。这个进程监听一个管道(channel),也就是这个进程的对外接口。所有对于缓存的写操作,都通过管道传送指令,这个机制,能保证对于缓存的内存块的写操作,都是串行的,因为只有一个进程在进行这样的操作,轻松解决了写冲突。然后我可以决定块内存是否允许并发的读取,如果不允许,我把缓存创建在进程内,如果允许,我把缓存创建在进程外,这样就轻松构建了一个提供单进程写,多进程读的缓存服务。


总结使用Go语言管道来进行并发安全的编程

   1.使用一个goroutine来管理一块内存的写操作

   2.为写操作提供管道接口,而不是function

   3.对于读操作,是否使用管道,取决于是否需要并发,如果需要并发,就提供function


   下一次,我来说说两个服务进程保持数据同步的实践。