写得好不如选得好--Go并发之美
2017-04-01 00:00
141 查看
多核服务器越来越普及,如何让服务器发挥出最大性能是所有编码人员最关心的事之一。先简单说说传统两种并发模式:
###Future模式
当客户端发送一个长时间的请求,服务器不需要等待数据处理完成就返回一个伪造的数据,客户端可以执行其他操作,再去服务器拿取处理后的数据。这个模型可以充分利用等待的时间。
###Master-Worker模式
Master-Worker是并发模型中最常用的模型之一,Master负责接收和分发任务,Worker负责处理任务 。
但是!!!如果想应用到生产环境中并且能处理比较高的并发,这两种模式的代码实现实在是太复杂,太复杂,太复杂!!!重要的事情说3遍,我是打算写一个C版的Master-Worker模式的,下面是我从入门到放弃的伪代码:
线程安全? 消息通知?
不用9999行代码,只需99,Go帮你用最少的代码写出高效的性能!
这里问题又来了,能不能告诉主线程,这些任务都结束呢?答案:yes 这里需要引入chanel概念,上面的代码可以优化为:+1::
channel使用make 来创建
int是说明这个管道是什么数据类型
向channel发送消息
c <- 1 ,简单,形象,有点像重定向
从channel输出数据
<- c
为什么会输出两次?
因为启用了2个goroutine
什么叫goroutine?
其实goroutine可以把他当成一个线程,但是它是一个代替原来线程概念的最小调度单位,他就是golang中的线程,一旦运行goroutine时,先去当当前线程查找,如果线程阻塞了,则被分配到空闲的线程,如果没有空闲的线程,那么就会新建一个线程。注意的是,当goroutine执行完毕后,线程不会回收退出,而是成为了空闲的线程。
channel分为两种:一种是有buffer的,一种是没有buffer的,默认是没有buffer的
打个比喻
无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。
无缓冲保证信能到你手上
有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。
有缓冲的 保证 信能进你家的邮箱
就是这个缓冲channel和goroutine在其他语言工具中是要多少行代码来实现,在go的世界里,这些东西都是so easy!!
由睿江云研发人员提供,想了解更多,请登陆www.eflycloud.com~
###Future模式
当客户端发送一个长时间的请求,服务器不需要等待数据处理完成就返回一个伪造的数据,客户端可以执行其他操作,再去服务器拿取处理后的数据。这个模型可以充分利用等待的时间。
###Master-Worker模式
Master-Worker是并发模型中最常用的模型之一,Master负责接收和分发任务,Worker负责处理任务 。
但是!!!如果想应用到生产环境中并且能处理比较高的并发,这两种模式的代码实现实在是太复杂,太复杂,太复杂!!!重要的事情说3遍,我是打算写一个C版的Master-Worker模式的,下面是我从入门到放弃的伪代码:
线程安全? 消息通知?
不用9999行代码,只需99,Go帮你用最少的代码写出高效的性能!
func handle(w string,sec int32){ //工作逻辑 } func main(){ go handle("test1",2) go handle("test2",3) time.Sleep(10) }
这里问题又来了,能不能告诉主线程,这些任务都结束呢?答案:yes 这里需要引入chanel概念,上面的代码可以优化为:+1::
var mygoroutine chan int func handle(w string,sec int32){ //工作逻辑 c <- 1 } func main(){ mygoroutine = make(chan int) go handle("test1",2) go handle("test2",3) <- mygoroutine <- mygoroutine }
channel使用make 来创建
int是说明这个管道是什么数据类型
向channel发送消息
c <- 1 ,简单,形象,有点像重定向
从channel输出数据
<- c
为什么会输出两次?
因为启用了2个goroutine
什么叫goroutine?
其实goroutine可以把他当成一个线程,但是它是一个代替原来线程概念的最小调度单位,他就是golang中的线程,一旦运行goroutine时,先去当当前线程查找,如果线程阻塞了,则被分配到空闲的线程,如果没有空闲的线程,那么就会新建一个线程。注意的是,当goroutine执行完毕后,线程不会回收退出,而是成为了空闲的线程。
channel分为两种:一种是有buffer的,一种是没有buffer的,默认是没有buffer的
打个比喻
无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。
无缓冲保证信能到你手上
有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。
有缓冲的 保证 信能进你家的邮箱
就是这个缓冲channel和goroutine在其他语言工具中是要多少行代码来实现,在go的世界里,这些东西都是so easy!!
由睿江云研发人员提供,想了解更多,请登陆www.eflycloud.com~
相关文章推荐
- GO1.5实现简单的http并发请求,支持:GET、POST、HEAD、PUT
- go语言并发爬取百度贴吧
- Go 的并发 Concurrency
- Go 语言构建高并发分布式系统实践
- Go语言并发模型的2种编程方案
- GO语言学习笔记3(函数接口并发)
- Go语言并发编程
- 【golang】go语言,进行并发请求的wrap变参封装
- Go 并发随机打印1-n
- go 带命名的并发安全库
- Go语言并发之美
- [ ECUG 专题回顾]《再谈 CERL:详论 GO 与 ERLANG 的并发编程模型差异》-许式伟(七牛云存储 CEO)
- Go-简洁的并发
- Go语言并发与并行学习笔记(三)
- 10 go并发编程-上
- 好记性不如烂笔头100-spring3(21)-高并发下的数据库自增主键
- Go语言之并发资源竞争
- 【go语言】Goroutines 并发模式(二)
- 用go写爬虫服务并发请求,限制并发数
- 在goroutine里并发调用sshagent出现panic的解决方案