文档章节

Go 语言基础—— 通道(channel)

刘一草
 刘一草
发布于 08/21 17:25
字数 817
阅读 80
收藏 0
Go

通过通信来共享内存(Java是通过共享内存来通信的)

定义
func service() string {
	time.Sleep(time.Millisecond * 50)
	return "Done"
}

func AsyncService() chan string {
	retCh := make(chan string, 1)//创建一个容量为1元素类型为string的通道
	go func() {
		ret := service()
		fmt.Println("returned result.")
		retCh <- ret//将值放入通道retCh中
		fmt.Println("service exited.")
	}()
	return retCh
}

func TestAsynService(t *testing.T) {
	retCh := AsyncService()
	otherTask()
	fmt.Println(<-retCh)//从通道retCh中取去出一个值
	time.Sleep(time.Second * 1)
}

通道创建语法: make(chan 元素类型, 容量),容量是可选值指通道最多可以缓存多少元素值,这个值不能为负数

当容量为0时,称为非缓冲通道,大于0时称为缓冲通道

通道是个队列,遵循先进先出的原则

元素值的发送和接受都需要用接收操作符 <-

进入通道的并不是在接受操作符右边的那个元素,而是它的副本

缓冲通道:

非缓冲通道:

多通道的选择
func TestSelect(t *testing.T) {
	select {
	case ret := <-retCh1://当通道retCh1中有数据时执行
		t.Log(ret)
	case ret := <-retCh2://当通道retCh2中有数据时执行
		t.Error("time out")
    //default不存在 retCh1  retCh2没数据时,协程会处在阻塞状态
    default://当通道retCh1,retCh2都没数据时执行
        t.Error("error")
	}
}
实现通道超时控制
select {
case ret := <-retCh:
    t.Log(ret)
case <-time.After(time.Second * 1): //设置超时时间
    t.Error("time out")
}
channel的关闭

向关闭的通道发送数据,会导致panic, 关闭已经关闭的通道也会导致panic;

接收操作是可以感知通道的关闭,并能安全退出

v, ok<-ch;ok为bool值, true表示正常接受, false表示通道关闭

所有的channel接收者都会在channel关闭时,立刻从阻塞等待中返回且上述 ok值为false,这个广播机制常被利用,进行向多个订阅者同时发送信号。如:退出信号。

channel关闭原则:

(1) 谁创建的channel谁负责关闭 (2) 不要关闭有发送者的channel (3) 作为函数参数的channel最好带方向

代码:

package channel_close

import (
	"fmt"
	"sync"
	"testing"
)

//生产者
func dataProducer(ch chan int, wg *sync.WaitGroup) {
	go func() {
		for i := 0; i < 10; i++ {
			ch <- i
		}
		close(ch)

		wg.Done()
	}()

}

//接收者
func dataReceiver(ch chan int, wg *sync.WaitGroup) {
	go func() {
		for {
			if data, ok := <-ch; ok {
				fmt.Println(data)
			} else {
				break
			}
		}
		wg.Done()
	}()

}

func TestCloseChannel(t *testing.T) {
	var wg sync.WaitGroup
	ch := make(chan int)
	wg.Add(1)
	dataProducer(ch, &wg)
	wg.Add(1)
	dataReceiver(ch, &wg)
	wg.Wait()

}

Context

·根Context:通过context.Background 0创建·

子Context: context.WithCancel(parentContext)创建

ctx, cancel := context.WithCancel(context.Background))

当前Context被取消时,基于他的子context都会被取消

·接收取消通知<-ctx.Done()

通道的高级用法

我们前面说的通道都是双向的,即:既可以发也可以收的通道;所谓单项通就是, 只能发坐着只能收

单项通道定义:

//发送通道(只能发不能收)
var uselessChan = make(chan<- int, 1)

//接收通道(只能收不能发)
var uselessChan1 = make(<-chan  int, 1)

通道是用来传递数据的,而单项通道是不能传递数据的


**** 码字不易如果对你有帮助请给个关注****

**** 爱技术爱生活 QQ群: 894109590****

© 著作权归作者所有

刘一草
粉丝 1
博文 21
码字总数 17522
作品 0
东城
私信 提问
Go基础编程:并发编程—channel

goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。 引⽤类型 channel 是 CSP 模式的具体实现,用于多个 goroutine ...

tennysonsky
2018/01/15
0
0
golang channel阻塞与非阻塞用法

以下代码会deadlock 为什么?因为push和pull永远不可能同时发生,这就是阻塞channel的不当用法。 怎么解决呢?可以这样: 通过在另一个协程中run push代码,使得channel的生产和消费可以同时...

Kenneth
2016/09/25
0
0
Golang channels 教程

Go语言内置了书写并发程序的工具。将go声明放到一个需调用的函数之前,在相同地址空间调用运行这个函数,这样该函数执行时便会作为一个独立的并发线程。这种线程在Go语言中称作goroutine。在...

愚安
2013/12/10
12.4K
7
实时 Django 终于来了 —— Django Channels 入门指南

今天,我们很高兴请到Jacob Kaplan-Moss。Jacob是来自Herokai,也是 Django的长期的核心代码贡献者,他将在这里分享一些他对某些特性的深入研究,他认为这些特性将重新定义框架未来。 当Dja...

oschina
2016/03/18
25.6K
13
【死磕Netty】—–NIO基础详解

原文出处http://cmsblogs.com/ 『chenssy』 转载请注明原创出处,谢谢! Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核...

chenssy
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
4
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部