程序员公众号【麦小丁】征集优质文章0岁的产品经理

区块链弹药库 — golang

2018-12-11  本文已影响6人  zidea

golang 悄悄走进的区块链 为服务器端大并发场景设计。国内都谁在用 golang 呢?

不用说 google ,人家推出的 golang 就是为了用和解决他面临的问题。google 在 Youtube、Google 的下载站点项目都用到了 golang。

转向国内来看

B:百度的部分流量前端已经是 golang 开发的了,现在日均分发流量千亿。

A:阿里具体应用到什么项目,没查看,如果了解请补充。支付宝好像在用 java,估计怕 golang 有漏洞吧,而且。

T:微信里面有用golang啊,腾讯也有很多部门用 golang。

中小创业的项目都会首选 java 和 golang 来开发。

如果想搞区块链,golang 也是应该掌握的一门语言。

说了很多 golang 的重要性,今天就介绍 golang 和核心—并发开始吧。golang很容易上手,如果对coroutine 这些概念熟悉的话,看几天就会了,翻译为协程,这是一个很重要的概念,很多现代需要都有对协程的实现。

如果不是我对真正并行的线程的追求,就不会认识到 Go 有多么的迷人。Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用 Thread库 来新建线程,还要用线程安全的队列库来共享数据。线程的成本很高,而且是有瓶颈的。

好上代码,正常程序是按一定顺序执行代码。

这种并发模式的内核只需要协程和通道就够了。协程负责执行代码,通道负责在协程之间传递事件。我们需要让 foo 和 bar 在协程中执行,这是由于如果通过线程来做并发是十分困难,并且成本很高。我将函数放在协程中执行,很简单,只需要在函数名前加上 go 即可。

执行代码,返现终端没有任何输出,只是因为现在程序分别跑在 3个协程,由于 main 协程执行 go foo 和 go bar 后就立即终止当掉了。所以我们看不到其他两个协程中执行的结果。

golang 中的 sync 包提供了 WaitGroup 。能够一直等到所有的 goroutine (协程)执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。

我们让两个 gorutine 更新一个变量 counter。我们需要 counter 有序增长。

这显然不是我们想要的结果。

使用 sync 包提供的 Mutex,我们可以将 counter 锁到gorutine 中,其他 goruntine 无法修改以达到目标。

我们调用 sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也有区别。

上一篇下一篇

猜你喜欢

热点阅读