GO channel 学习

news2024/9/23 17:24:08

引言

单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。


Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而
不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。


Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也
就是声明channel的时候需要为其指定元素类型。 

package main

import "fmt"

// 类似于pipe[]管道
func main() {
	//ch := make(chan int, 10) //有缓冲大小的管道
	//ch <- 12
	//var x int
	//x = <-ch
	//fmt.Println(x)
	//c := make(chan int) //开辟的空间 cap是3,长度
	//
	//go func() {
	//	defer println("go 程关闭")
	//	fmt.Println("go 程运行正在向chan写入数据")
	//	c <- 666 //由于是无缓冲的,所以必须得立刻接收,不然一直阻塞
	//}()
	//num := <-c
	//fmt.Println("主程序接受管道 值为:", (num))
	//fmt.Println(len(c), cap(c))
	
	//ch := make(chan int)
	//go func() {
	//	defer close(ch) //延迟关闭通道
	//	for i := 0; i < 5; i++ {
	//		ch <- i
	//	}
	//}()
	//for {
	//	if data, ok := <-ch; ok {
	//		fmt.Println(data)
	//	} else {
	//		break
	//	}
	//}
	
	/*
		c := make(chan int)
		go func() {
			for i := 0; i < 5; i++ {
				c <- i
				time.Sleep(1 * time.Second)
			}
			close(c)
		}()
		//迭代,会自动阻塞
		for data := range c {
			fmt.Println(data)
		}*/

	//	select 多路复用
	c := make(chan int)
	quit := make(chan int)

	go func() {
		for i := 0; i < 5; i++ {
			fmt.Println(<-c)
		}
		quit <- 0
	}()
	fibonace(c, quit)

}

func fibonace(c, quit chan int) {
	x, y := 1, 1
	for {
		select {
		case c <- x: //如果c可写 ,x就会进来
			x, y = y, x+y
		case <-quit:
			fmt.Println("quit")
			return
		}

	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频语音转文字工具用哪个好?推荐6款优质的视频转文字工具

在沉浸于电影情节时&#xff0c;周遭的喧嚣往往成了享受视听的障碍&#xff0c;这时&#xff0c;字幕的重要性便不言而喻。 字幕的作用远不止于此&#xff0c;它是听力受限观众的桥梁&#xff0c;也是语言学习者的得力助手。幸运的是&#xff0c;将视频语音转文字字幕现已变得…

红酒与未来科技:传统与创新的碰撞

在岁月的长河中&#xff0c;红酒以其深邃的色泽、丰富的口感和不同的文化魅力&#xff0c;成为人类文明中的一颗璀璨明珠。而未来科技&#xff0c;则以其迅猛的发展速度和无限的可能性&#xff0c;领着人类走向一个崭新的时代。当红酒与未来科技相遇&#xff0c;一场传统与创新…

电脑自动重启是什么原因呢?99%人都不知道的解决办法,直接打破循环

当你的电脑突然毫无预警地自动重启&#xff0c;不仅打断了工作流程&#xff0c;还可能导致未保存的数据丢失&#xff0c;这无疑是一件令人沮丧的事情。那么&#xff0c;电脑自动重启是什么原因呢&#xff1f;有什么方法可以解决呢&#xff1f;别担心&#xff0c;在大多数情况下…

对象与键值对数组的相互转换Object.entries与Object.fromEntries

Object.entries是JavaScript中的一个内置方法&#xff0c;它可以将一个对象的属性和值转换为一个包含键值对的数组。 let obj {name: mike,age: 18,sex: man } Object.entries(obj)Object.entries的使用场景: 1、动态更新对象属性 let obj {name: mike, age: 18, sex: man…

《昇思25天学习打卡营第02天|qingyun201003》

日期 心得 通过这次的学习&#xff0c;主要是了解过张量的基础概念&#xff0c;同时也知道有关构造张量的方法。通过索引查询张量&#xff0c;张量的运算。通过concat\stack 将张量进行维度链接。Tensor与NumPy的互相转换&#xff0c;但是我似乎并不了解什么它们的概念。也认知…

电脑视频去水印软件哪个好用,电脑上视频去水印的软件

在数字化时代&#xff0c;视频创作已成为许多人展示才华和创意的重要途径。然而&#xff0c;视频中的水印常常让人感到头疼&#xff0c;尤其是当水印影响了视频的整体美观时。本文将为你揭秘如何在电脑上使用各种软件去除视频水印&#xff0c;让你的作品更加专业&#xff01; 方…

时光穿梭机:AI如何让老照片焕发新生,跃然“动”起来

在岁月的长河中&#xff0c;每一张老照片都是时间的低语&#xff0c;承载着过往的记忆与温情。它们静静地躺在相册的角落&#xff0c;或是泛黄的相纸上&#xff0c;定格了某个瞬间的欢笑与泪水&#xff0c;却也因此失去了那份生动的活力。然而&#xff0c;随着人工智能&#xf…

如何做一个迟钝不受伤的打工人?

一、背景 在当前激烈的职场环境中&#xff0c;想要成为一个相对“迟钝”且不易受伤的打工人&#xff0c;以下是一些建议&#xff0c;但请注意&#xff0c;这里的“迟钝”并非指智力上的迟钝&#xff0c;而是指在应对复杂人际关系和压力时展现出的豁达与钝感力&#xff1a; 尊重…

如何在Linux系统安装openGauss数据库并使用固定公网地址远程连接

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 本文主要介绍如何在Linux系统如何安装openGauss数据库管理系统&#xff0c;并结合cpolar内网穿透工具生成…

docker基础知识以及windows上的docker desktop 安装

记录以供备忘 基础概念&#xff1a; 什么是docker 将程序和环境一起打包&#xff0c;以在不同操作系统上运行的工具软件 什么是基础镜像 选一个基础操作系统和语言后&#xff0c;将对应的文件系统、依赖库、配置等打包为一个类似压缩包的文件&#xff0c;就是基础镜像 什么是…

【银河麒麟高级服务器操作系统】数据中心系统异常卡死分析处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问&#xff1a;https://product.kylinos.cn 1.服务器环境以及配置 【机型】浪潮NF5280M5 处理器&#xff1a; Intel 内存&#xff1a; 1T 【内核版本】 4.19.90-24.4.v2101.ky10.x86_64 【OS镜像版本】 银河麒麟…

python 屏幕显示一个文本窗口,文本窗口显示在当前鼠标在的位置,该文字窗口跟随鼠标移动,并且始终保持最前面显示 ,可以根据文字的多少来自动调节窗口大小

python 屏幕显示一个文本窗口,我有一段文字需要显示,鼠标在那里,文本窗口就在哪里显示,该文字窗口需要跟随鼠标移动,并且始终保持最前面显示,可以根据文字的多少来自动调节窗口大小 仅仅使用 tkinter # -*- coding:utf-8 -*-import tkinter as tkdef update_position(e…

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片

安卓微信8.0之后如何利用缓存找回的三天之前不可见的朋友圈图片 复习了下安卓程序的知识&#xff0c;我们会了解到&#xff0c;安卓程序清楚数据的时候有两个选项 一个是清除全部数据一个是清除缓存。 清除全部数据表示清除应用数据缓存。 对于安卓微信8.0之后而言&#xff0…

动态规划|最长不下降子序列(自用)

参考视频小电视&#xff1a;【动态规划3-1&#xff1a;最长不下降序列】https://www.bilibili.com/video/BV1fK411L751?vd_source8e5e1c8c2ec3b6912ce3d9aa0c73f879 题目 题目分析 使用下标进行存储访问 int a[201]; int f[201];//从第i个数开始的长度 int p[201];//位置访…

centos磁盘空间满了-问题解决

报错问题解释&#xff1a; CentOS系统在运行过程中可能会出现磁盘空间不足的错误。这通常发生在以下几种情况&#xff1a; 系统日志文件或临时文件过大导致磁盘空间不足。 安装了大量软件或文件而没有清理无用文件。 有可能是某个进程占用了大量磁盘空间。 问题解决方法&a…

【C++杂货铺】C++11新特性

目录 &#x1f308; 前言&#x1f308; &#x1f4c1; C11介绍 &#x1f4c1; 统一初始化列表 &#x1f4c1; 声明 &#x1f4c2; auto &#x1f4c2; decltype &#x1f4c2; 返回类型后置 &#x1f4c2; 范围for &#x1f4c2; 模板别名 &#x1f4c2; nullptr &#x1…

彻底开源,免费商用,上海AI实验室把大模型门槛打下来

终于&#xff0c;业内迎来了首个全链条大模型开源体系。 大模型领域&#xff0c;有人探索前沿技术&#xff0c;有人在加速落地&#xff0c;也有人正在推动整个社区进步。 就在近日&#xff0c;AI 社区迎来首个统一的全链条贯穿的大模型开源体系。 虽然社区有LLaMA等影响力较大…

链表二 链表常见算法题

目录 ListNode代码 链表中倒数最后k个结点 描述 示例1 示例2 解题思路 AC代码 不借助指针 快慢指针 删除链表中重复的结点 描述 示例1 示例2 解题思路 AC代码 可测试运行代码(需要ListNode代码&#xff0c;在文章开头)&#xff1a; 运行结果 ​​​​​​​链表…

windows安装启动mysql8.0版本的简单流程

1.下载mysql8.0.25版本 MySQL :: Download MySQL Community Server (Archived Versions) 2.解压到D盘的mysql文件夹,并修改环境变量 配置环境变量: winr键>输入control system>高级系统设置>点击环境变量 双击path后,新建 将bin目录粘贴进去,再点击确定 在cmd命令行…

萝卜快跑的狠活

萝卜快跑作为百度旗下的自动驾驶出行服务平台&#xff0c;在科技应用上展现了多项领先的技术。以下是萝卜快跑采用的一些主要科技“狠活”&#xff1a; 自动驾驶技术&#xff1a; 萝卜快跑主要使用了百度Apollo的L4级自动驾驶技术&#xff0c;该技术能够应对海量的城市道路场景…