所谓夹带私货,就是第一篇看上去很客观,第二篇隐约指出Go语言是一门好语言,这第三篇,完全是讲Go语言编程,不关心的读者可以忽略。
上一篇我们说到Erlang是适应多核编程的语言,因为
1.进程间不共享内存
2.进程间使用消息通讯
3.不使用锁
其中,不使用锁,是因为进程间不共享内存,每个进程内部的操作都是串行的,不会有并发冲突。在这个方面,所有支持共享内存的语言都可以写成内存不共享,从而避免使用锁。那么如果一定要共享内存的场景怎么办,比如我们之前提起过的缓存服务,希望能利用多进程来提高吞吐能力,提高同一块内存的利用率。
如果是java,就一定要加锁,一个进程写的时候,不允许其它进程写,我是有加锁恐惧症,想到加锁就会害怕。
好在go语言有管道(channel)这个选择,借鉴Erlang的思想,我们创建一个进程(goroutine),假装拥有了整个缓存的内存块。这个进程监听一个管道(channel),也就是这个进程的对外接口。所有对于缓存的写操作,都通过管道传送指令,这个机制,能保证对于缓存的内存块的写操作,都是串行的,因为只有一个进程在进行这样的操作,轻松解决了写冲突。然后我可以决定块内存是否允许并发的读取,如果不允许,我把缓存创建在进程内,如果允许,我把缓存创建在进程外,这样就轻松构建了一个提供单进程写,多进程读的缓存服务。
总结使用Go语言管道来进行并发安全的编程
1.使用一个goroutine来管理一块内存的写操作
2.为写操作提供管道接口,而不是function
3.对于读操作,是否使用管道,取决于是否需要并发,如果需要并发,就提供function
下一次,我来说说两个服务进程保持数据同步的实践。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。