多核计算与并发编程三 使用Go语言的管道

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

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

1.进程间不共享内存

2.进程间使用消息通讯

3.不使用锁

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

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

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


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

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

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

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


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

相关文章

什么是Go的接口? 接口可以说是一种类型,可以粗略的理解为他...
1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下...
1、概述 1.1 Protocol buffers定义 Protocol buffe...
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat(...
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指...
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=1...