分享
  1. 首页
  2. 文章

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

aura521521 · · 9693 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

本文简单介绍如何用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, ID is : %d \n", p)
		}
	}
}
func main() {
	c := make(chan int)
	go producer(c)
	consumer(c)
}

执行结果如下:
Aliceputsproduct,IDis:0
Aliceputsproduct,IDis:1
Bobgetsproduct,IDis:0
Bobgetsproduct,IDis:1
Aliceputsproduct,IDis:2
Aliceputsproduct,IDis:3
Bobgetsproduct,IDis:2
Bobgetsproduct,IDis:3
Aliceputsproduct,IDis:4
Aliceputsproduct,IDis:5
Bobgetsproduct,IDis:4
Bobgetsproduct,IDis:5
Aliceputsproduct,IDis:6
Aliceputsproduct,IDis:7
Bobgetsproduct,IDis:6
Bobgetsproduct,IDis:7
Aliceputsproduct,IDis:8
Aliceputsproduct,IDis:9
Bobgetsproduct,IDis:8
Bobgetsproduct,IDis: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, ID is : %d \n", p)
		}
	}
}
再运行之,则程序不会终止。请读者仔细分析下,这个涉及到golang的语法特性,希望以后有机会再blog中介绍下golang的一些有用的特性。

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

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





有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:aura521521

查看原文:golang并发编程实践 -- 简单生产者消费者(with chan)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
9693 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏