分享
  1. 首页
  2. 文章

golang 并发一

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

golang并发一

在go里,每一个并发执行的活动称为goroutine。go有两种并发编程风格,通信顺序进程模式(基于channel),共享内存。

在go里面创建一个goroutine特别简单,只需在函数前面添加关键字go即可

func f() {
 //TODO ADD CODE HERE
}
func main() {
 go f()
}

go f()即创建了一个goroutine,并且并发执行函数f

通信顺序进程模式

通道

通道是goroutine之间的连接,可以让一个goroutine将值发送给另一个goroutine。每个通道都有一个具体的类型,一个int型的通道写作chan int。

通道有三个操作:发送,接收,关闭(不常用)。

缓冲通道有一个缓冲队列,接收操作从队列的头部移除一个元素,发送操作在队列的尾部插入一个元素,如果队列已满,则发送操作阻塞,队列为空,则接受操作为空。

当通道容量为0时,发送操作会阻塞,直到另一个goroutine进行接收操作,这时值传送完成,两个goroutine继续工作。接收操作同理。

代码示例

  • 创建通道

    channel := make(chan int)
    
  • 创建缓冲通道

    channel := make(chan struct{},3)
    
  • 向通道发送数据

    channel <- 1
    
  • 从通道接收数据

    _ = <- channel
    

    我们可能需要限制某个函数只可以进行发送操作,某个函数只可以进行接收操作,这可以通过在参数类型中声明chan <- int 表示这可以进行发送操作,类型<- chan int表示只可以进行接收操作。

一下代码我们实现一个生产者和消费者示例:

func main() {
 channel := make(chan int, 10)
 for i := 0; i < 10; i++ {
 go procedur(channel)
 }
 for i := 0; i < 12; i++ {
 go consumer(channel, i)
 }
 for {
 time.Sleep(time.Second)
 }
}
//生产者 只可以进行发送操作
func procedur(channel chan<- int) {
 for i := 0; i < 101; i++ {
 channel <- i
 i %= 100
 time.Sleep(time.Millisecond * 100)
 }
}
//生产者 只可以进行接收操作
func consumer(channel <-chan int, id int) {
 for {
 v := <-channel
 fmt.Println(id, v)
 time.Sleep(time.Millisecond * 200)
 }
}

模仿了十个生产者和十二个消费者的情况

select 多路复用

select 语句类似switch 语句,有一系列情况和一个可选的默认分支,每一个情况指定一次通信和关联的代码块。

以下势力为随机生成数字以及输出的示例

channel := make(chan int, 10)
for i := 0; i < 100; i++ {
 select {
 case v := <-channel:
 fmt.Println(v)
 case channel <- i:
 }
}

需要注意的是,如果有多个情况同时满足,select随机选择一个进行执行。


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

本文来自:开源中国博客

感谢作者:色狼叔叔来了

查看原文:golang 并发一

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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