文档章节

Go 使用channel控制并发

恋恋美食
 恋恋美食
发布于 11/13 12:03
字数 517
阅读 13
收藏 1
Go

1. 前言

channel一般用于协程之间的通信,channel也可以用于并发控制。比如主协程启动N个子协程,主协程等待所有子协程退出后再继续后续流程,这种场景下channel也可轻易实现。

2. 场景示例

下面程序展示一个使用channel控制子协程的例子:

package main

import (
    "time"
    "fmt"
)

func Process(ch chan int) {
    //Do some work...
    time.Sleep(time.Second)

    ch <- 1 //管道中写入一个元素表示当前协程已结束
}

func main() {
    channels := make([]chan int, 10) //创建一个10个元素的切片,元素类型为channel

    for i:= 0; i < 10; i++ {
        channels[i] = make(chan int) //切片中放入一个channel
        go Process(channels[i])      //启动协程,传一个管道用于通信
    }

    for i, ch := range channels {  //遍历切片,等待子协程结束
        <-ch
        fmt.Println("Routine ", i, " quit!")
    }
}

上面程序通过创建N个channel来管理N个协程,每个协程都有一个channel用于跟父协程通信,父协程创建完所有协程中等待所有协程结束。

这个例子中,父协程仅仅是等待子协程结束,其实父协程也可以向管道中写入数据通知子协程结束,这时子协程需要定期的探测管道中是否有消息出现。

3. 总结

使用channel来控制子协程的优点是实现简单,缺点是当需要大量创建协程时就需要有相同数量的channel,而且对于子协程继续派生出来的协程不方便控制。

后面继续介绍的WaitGroup、Context看起来比channel优雅一些,在各种开源组件中使用频率比channel高得多。

© 著作权归作者所有

共有 人打赏支持
恋恋美食

恋恋美食

粉丝 87
博文 100
码字总数 91804
作品 0
杭州
高级程序员
私信 提问
使用golang的channel的坑

很多时候我们经过使用有缓冲channel作为通信控制的功能,以至有一些误解和坑出现。 误解一:有缓存channel是顺序的 执行下面代码。 package mainimport ( "time" "math/rand")func main(){ c...

梦朝思夕
2017/09/18
0
0
【go语言】Goroutines 并发模式(二)

前言 在Goroutines 并发模式(一)中,我们简单地通过boring函数的例子来粗略地阐述了通过channels来和goroutines交流的方法。在本篇中,我将从pattern的方向出发,通过对boring函数的例子进...

何良瑞Nyanko君
2014/05/31
0
2
Go的channel常见使用方式

go关键字可以用来开启一个goroutine(协程))进行任务处理,而多个任务之间如果需要通信,就需要用到channel了。 上面这个简单的例子就是新开启的goroutine向intChan发送了一个1的值,那么在主...

Ihesong
11/21
0
0
Go实例讲解,利用channel实现协程的互动-会聊天的Tom&Jerry

先上实例代码,后面再来详细讲解。 /** * 通过协程,多任务执行 * 会聊天的Tom和Jerry * 通过 channel 让两个goroutine协作起来 */package main import ( "fmt" "sync") func main() { wg :...

一凡Sir
07/24
0
0
Goroutine + Channel 实践

goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine的调度是有Golan...

黑神领主
2016/12/10
60
0

没有更多内容

加载失败,请刷新页面

加载更多

webpack4 css打包、压缩、分离、去重等优化配置详解

Webpack 4 目前版本已经到了4.27 相较于前面的版本还是有一些改动的,具体可以参考升级指南 迁移到新版本 这里只介绍 css 的 打包、压缩、分离、去重 的方法; 不懂的或者有更优的方案,欢迎...

zerokb-小浪
4分钟前
0
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云官方博客
12分钟前
0
0
Tomcat配置强制https端口变成8443的解决办法

Tomcat配置强制https端口变成8443的解决办法 2017年10月18日 10:44:10 我们始终是路人 阅读数:2953 标签: tomcathttps8443443 更多 个人分类: Tomcat 版权声明:本文为博主原创文章,未经...

linjin200
13分钟前
0
0
基于协同过滤算法的推荐

基于协同过滤算法的推荐 (本实验选用数据为真实电商脱敏数据,仅用于学习,请勿商用) 数据挖掘的一个经典案例就是尿布与啤酒的例子。尿布与啤酒看似毫不相关的两种产品,但是当超市将两种产...

阿里云云栖社区
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部