加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:57:35 所属栏目:大数据 来源:网络整理
导读:所谓夹带私货,就是第一篇看上去很客观,第二篇隐约指出Go语言是一门好语言,这第三篇,完全是讲Go语言编程,不关心的读者可以忽略。 上一篇我们说到Erlang是适应多核编程的语言,因为 1.进程间不共享内存 2.进程间使用消息通讯 3.不使用锁 其中,不使用锁,

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

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

1.进程间不共享内存

2.进程间使用消息通讯

3.不使用锁

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

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

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


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

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

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

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


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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读