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

golang并发编程实践 -- 简单生产者消费者(with chan)

发布时间:2020-12-16 19:02:01 所属栏目:大数据 来源:网络整理
导读:本文简单介绍如何用golang实现经典的生产者消费者模型。 golang语法简洁,凡可以通过几行代码解决的事情,绝不为了解决该问题而在语言中引入不必要的特性。这个和c++正好相反,c++是个庞大的怪物,我这么形容可能很多c++的fans心里要不舒服了,为了让你在看

本文简单介绍如何用golang实现经典的生产者消费者模型。


golang语法简洁,凡可以通过几行代码解决的事情,绝不为了解决该问题而在语言中引入不必要的特性。这个和c++正好相反,c++是个庞大的怪物,我这么形容可能很多c++的fans心里要不舒服了,为了让你在看到诸如子类言论时能够心平气和,建议大家使用一下golang吧。本文不是介绍golang编程语言本身的文章,而是从golang如何让并发编程变得容易的角度来窥视一下golang。下面是用golang提供的chan特性来实现经典的生产者消费者模型的例子:

package main

import (
	"fmt"
)

func producer(c chan int) {
	for i := 0; i < 10; i++ {
		fmt.Printf("Alice puts product,ID is : %d n",i)
		c <- i
	}
	defer close(c)
}
func consumer(c chan int) {
	hasMore := true
	var p int
	for hasMore {
		if p,hasMore = <-c; hasMore {
			fmt.Printf("Bob gets product,p)
		}
	}
}

func main() {
	c := make(chan int)
	go producer(c)
	consumer(c)
}

执行结果如下:
Alice puts product, ID is : 0
Alice puts product, ID is : 1
Bob gets product, ID is : 0
Bob gets product, ID is : 1
Alice puts product, ID is : 2
Alice puts product, ID is : 3
Bob gets product, ID is : 2
Bob gets product, ID is : 3
Alice puts product, ID is : 4
Alice puts product, ID is : 5
Bob gets product, ID is : 4
Bob gets product, ID is : 5
Alice puts product, ID is : 6
Alice puts product, ID is : 7
Bob gets product, ID is : 6
Bob gets product, ID is : 7
Alice puts product, ID is : 8
Alice puts product, ID is : 9
Bob gets product, ID is : 8
Bob gets product, ID is : 9

其中Alice是生产者,Bob是消费者,他们通过chan来达到同步通信的效果。这里并未用到诸如锁之类的概念,而且在golang中go routine本身是非常廉价的。启动一个go routine要比thread占用的资源更少,而且go routine的个数只限制于你机器内存的大小。所以可以根据工程的实际需要启动适宜个数的go routine。

上面代码中有一处要说明的就是如果把consumer函数中的代码修改成:

func consumer(c chan int) {
	hasMore := true
	// var p int
	for hasMore {
		if p,hasMore := <-c; hasMore {
			fmt.Printf("Bob gets product,p)
		}
	}
}
再运行之,则程序不会终止。请读者仔细分析下,这个涉及到golang的语法特性,希望以后有机会再blog中介绍下golang的一些有用的特性。

还是简单的对上面的代码做下说明吧,for 中的hashMore和if 表达式中的hasMore变量不是同一个。p,hasMore := <-c 相当于又定义个了个新的变量,其作用域要比for循环中的hasMore作用域要小,希望读者在日后开发golang的时候稍微注意下。

本文是草稿,待日后完善。

(编辑:李大同)

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

    推荐文章
      热点阅读