首页 > 其他分享 >Go语言入门14(channel通道01)

Go语言入门14(channel通道01)

时间:2023-05-05 16:12:13浏览次数:40  
标签:wg 01 14 缓冲 routine Go 数据 channel 通道

channel(一)

​ channel用于goroutines之间的通信,让它们之间可以进行数据交换。像管道一样,一个goroutine_A向channel_A中放数据,另一个goroutine_B从channel_A取数据

channel 基本语法

// 因为channel是指针类型的数据类型,所以通过make来分配内存
// 使用make声明一个channel,里面可以存放string类型的数据
channel := make(chan string)
// 将tmp送到channel中
channel <- tmp
// 从channel中接受数据给tmp
tmp := <- channel
// 从channel中接受数据给tmp,如果没有接受到则ok值为false
tmp,ok := <- channel
// 关闭通道channel
close(channel)

无缓冲的通道

​ 没有缓冲的通道,如果routine A向通道中发送了一个数据,那么必须等到这个数据被其他routine 取出之后,才能继续往通道里发送,严格遵循”一进一出“原则,这也就要求两个routine 在同时对同一个通道进行写操作和取操作

  • sender端向channel中send一个数据,然后阻塞,直到receiver端将此数据receive
  • receiver端一直阻塞,直到sender端向channel发送了一个数据
// 两个routine分别对一个通道进行取放操作,并且对里面的数据+1,到2000截至
// 严格遵循“一进一出”
func Routine01(wg *sync.WaitGroup, count chan int) {
	defer wg.Done()
	for {
        // 从通道中拿取数据
		res, ok := <-count
		if !ok {
            // 说明通道中已经没有数据,或者已被关闭
			fmt.Println("finish!")
			break
		}
		fmt.Println(res)
		if res == 2000 {
			close(count)
			break
		}
		count <- res + 1
	}
}

func main() {
	var wg sync.WaitGroup
    // 新建一个无缓冲的通道count
	count := make(chan int)
	wg.Add(2)
    // 创建两个协程
	for i := 0; i < 2; i++ {
		go Routine01(&wg, count)
	}
    // 给管道里送一个数据,来开始操作
	count <- 1
	wg.Wait()
}

有缓冲的通道

​ 有缓冲的通道,可以控制里面的缓冲区大小,可以借助通道实现异步的取放操作

  • 容量:表示buffered channel最多可以缓冲多少个数据
  • 长度:表示buffered channel当前已缓冲多少个数据
  • 创建buffered channel的方式为make(chan TYPE,CAP)
// 新建Routine来模拟机器人工作
func Routine02(wg *sync.WaitGroup, count chan string) {
	defer wg.Done()
	for {
        // 从通道中分配工作
		tmp, ok := <-count
		if !ok {
            // 代表通道已经空了,或者已被关闭
			fmt.Println("No task else!")
			break
		}
		fmt.Println(tmp + " start!")
		time.Sleep(200 * time.Millisecond)
		fmt.Println(tmp + " done!")
	}
}

func main() {
	var wg sync.WaitGroup
    // 新建一个缓冲区大小为5的通道,来管理工作
	count := make(chan string, 5)
	wg.Add(2)
	fmt.Println("Work start!")
    // 往缓冲区中放一系列待完成的工作
	for i := 0; i < 5; i++ {
		tmp := fmt.Sprintf("Task %d", i)
		count <- tmp
		fmt.Println(tmp + " in!")
	}
	for i := 0; i < 2; i++ {
		go functions.Routine(&wg, count)
	}
    // 关闭通道
	close(count)
	wg.Wait()
}

标签:wg,01,14,缓冲,routine,Go,数据,channel,通道
From: https://www.cnblogs.com/te9uila/p/17374431.html

相关文章

  • Google谷歌语法 - 让搜索事半功倍
    高效率的搜索方法-谷歌语法适用于多种搜索引擎,原主要对象为Google搜索引擎,其他搜索引擎也适用,如必应bing,百度,搜狗等语法类搜索方法site语法site意思为站点,该语法是限制搜索的目标为域名,然后搜索子域名。比如我们搜索“site:edu.cn”,这样搜出来的内容都是有关于学校的内容,而......
  • 01_java面向对象编程语言的思考
    java的跨平台在各个操作平台上,有一层JVM(java虚拟机),这是支撑java程序能够运行的基础。java源代码→(编译)→java字节码→(运行)→java虚拟机jdk:java开发工具包jre:java运行环境jvm:java虚拟机api:应用程序接口程序目录主要结构lib目录:存放Java的类库文件bin:java编译器,解释器工具......
  • Go并发编程实战
    概述基础理论Donotcommunicatebysharingmemory;instead,sharememorybycommunicating.简单来说所谓并发编程是指在一个处理器上“同时”处理多个任务;宏观上并发是指在一段时间内,有多个程序在同时运行;在微观上并发是指在同一时刻只能有一条指令执行,但多个程序指令被......
  • 2014年武汉的IT行情好像不太好(续):20个月过后,再看当时面试过的几个公司--武汉财富基石
     2014年9月的时候,写过一篇面试的总结性质的文章,“2014年武汉的IT行情好像不太好”。最近,有个网友对这篇文章发表了一个评论,“只看看,不说话”,就顺便再看了原来写的这篇文章。不过呢,一转眼,20个月过去了,我倒是很想再去说说其中的几家公司。和大家透露下,当初参加过面试的一......
  • 【2】Django项目-人力资源管理系统-设计表结构
    Django项目-人力资源管理系统-设计表结构一、在models.py中编写表结构创建两张表:部门表和用户信息表fromdjango.dbimportmodels#Createyourmodelshere.classDepartment(models.Model):'''部门表'''dp_name=models.CharField(max_length=32,verbo......
  • django3.0异步、提高项目并发量
    1补充django3.0#补充:django3.0以后支持异步-ASGI:WSGI是基于HTTP协议模式的,不支持WebSocket(需要其他模块处理,eg:channels)ASGI的诞生则是为了解决Python常用的WSGI,不支持当前Web开发中的一些新的协议标准,例如:websocket,http2的协议,且还支持异步-django......
  • 20201230张国强实验三
    免杀原理1.基础问题回答杀软是如何检测出恶意代码的?基于特征码的静态扫描技术在文件中寻找特定的十六进制字符串,如果找到,就可判定文件感染了某种病毒。启发式杀毒技术病毒要达到感染和破坏的目的,通常的行为都会有一定的行为和特征,所以可以通过分析相关的病毒指令,判......
  • Educational Codeforces Round 147 (Rated for Div. 2) (贪心)
    原题链接:https://codeforces.com/contest/1821/problem/D*题意:从1开始走,走的给定区间的值要k次。且shift按了要松开,代表走了一个区间除了往右的次数,还要多两次按shift的次数,求最小次数。*思路:1.先把不可能的情况列出来,就是给出的区间大小小于k时直接输出-12.我的思路是暴......
  • CSC8016用户场景
    CourseworkCSC8016UseCaseScenarioWewanttoimplementavirtualshoppingsystem,whetherthethreadsareeitherclientsusingthewebapp,orclientsbuyingproductsonthephysicalshopusingthemobileapp.Thelifecycleofanyclientinteractionissum......
  • Django项目-人力资源管理系统
    人力资源管理系统【HRMS】一、pycharm新建项目1.新建项目2.创建APP-website2.1  方法1:终端输入pythonmanage.pystartappwebsite2.2 方法2:利用Pycharm工具输入:快捷键 CTRL+ALT+R输入startappwebsite 2.3 创建完成 ......