Go程序设计语言翻译问题(goroutine)

news2024/11/27 20:29:47

中文:Go程序设计语言 2017.1
英文:The Go Programming Language 2016

8.4.2. Pipelines
8.4.2管道章节

在这里插入图片描述
修正:
第一个管道应该改成通道,cannel是概念词汇
重要概念词汇不能混淆
来自chatGPT3.5:
Go Pipelines和channel都是Go语言中用于实现并发编程的重要特性,但它们之间有一些区别。

首先,Go Pipelines是一种将多个阶段的处理连接在一起的方式,每个阶段都是一个goroutine,它们通过channel进行通信。Go Pipelines通常用于处理数据流,例如从文件或网络读取数据,对数据进行处理,然后将结果写回文件或网络。Go Pipelines的优点是可以将处理过程分解为多个阶段,每个阶段都可以并行执行,从而提高处理效率。

相比之下,channel是一种用于在goroutine之间进行通信的机制。通过channel,一个goroutine可以向另一个goroutine发送数据,也可以从另一个goroutine接收数据。channel的优点是可以实现goroutine之间的同步和通信,从而避免了共享内存带来的并发问题。

因此,Go Pipelines和channel都是Go语言中用于实现并发编程的重要特性,但它们的应用场景略有不同。Go Pipelines通常用于处理数据流,而channel则用于实现goroutine之间的同步和通信。

Go Pipelines通常包含多个goroutine和多个channel。在Go Pipelines中,每个阶段都是一个goroutine,它们通过channel进行通信。每个阶段通常会有一个输入channel和一个输出channel,用于接收上一阶段的输出和向下一阶段发送数据。因此,Go Pipelines通常包含多个goroutine和多个channel,它们协同工作以完成数据处理任务

在这里插入图片描述
修正:
删除“因为通道会满”(原文没有提及)
我个人不太喜欢这个简单的解释,
我的理解(参考chat):

  1. 如果放在主goroutine循环前,具体执行来说:
    当 for f := range filenames 循环开始执行时,它会从 filenames 通道中获取一个文件名,然后将该文件名发送到 jobs 通道中,表示需要处理该文件。然后,它会等待 worker goroutine 向 sizes 通道发送一个消息,表示该文件已经处理完毕。但是,由于 wg.Wait() 的计数器一直没有被归零(因为wg.Add(1)执行了),阻塞,worker goroutine 无法向 sizes 通道发送消息,因此 for f := range filenames 循环会一直等待下去,从而导致程序陷入死锁状态。

  2. 如果放在主goroutine循环后,因为如果没有go,sizes管道只能放入一个内容,而wg.Wait()会阻塞,导致无法执行到for size := range sizes(循环去除放入的管道内容),
    //此时被放入管道内容就一直没人拿出来,导致后面goroutine也一直放不进去,卡死
    补充下更详细的说明:

func makeThumbnails6(filenames <-chan string) int64 {
	sizes := make(chan int64)
	var wg sync.WaitGroup // number of working goroutines
	for f := range filenames {
		wg.Add(1) //必须在goroutine开始前调用,我们无法确保Add发送在close之前
		// worker
		go func(f string) {
			defer wg.Done() //使用defer来确保即使出现错误,计数器也会递减
			thumb, err := thumbnail.ImageFile(f)
			if err != nil {
				log.Println(err)
				return
			}
			info, _ := os.Stat(thumb) // OK to ignore error
			sizes <- info.Size()
		}(f)
	}

	//必须和上面的循环并发执行,否则会导致卡死,
	//因为如果没有go,sizes管道只能放入一个内容,而wg.Wait()会阻塞,导致无法执行到for size := range sizes(循环去除放入的管道内容),
	//此时被放入管道内容就一直没人拿出来,导致后面goroutine也一直放不进去,卡死
	go func() {
		wg.Wait() //阻塞当前的 goroutine 直到计数器被归零(当计数器减为 0 时,允许程序继续执行下去)
		close(sizes)
	}()

	var total int64
	// 这里不是循环sizes数组,是循环获取sizes的管道信息,每次goroutine执行完就会插入一个数据,循环就会进行读取
	for size := range sizes {
		total += size
	}
	return total
}

正确顺序:
在这里插入图片描述

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

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

相关文章

(kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式&#xff1a;二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办&#xff1f; YAML…

【Linux】1. Linux常见指令

专栏导读 &#x1f341;作者简介&#xff1a;余悸&#xff0c;在读本科生一枚&#xff0c;致力于 C方向学习。 &#x1f341;收录于 C 专栏&#xff0c;本专栏主要内容为 C 初阶、 C 进阶、 STL 详解等&#xff0c;持续更新中&#xff01; &#x1f341;相关专栏推荐&#xff1…

社会关系抽取赛题提交指南

社会关系抽取赛题提交指南 一、赛题背景 本次主要为大家介绍社会科学计算大赛的赛题之一---社会关系抽取。 1.技术发展 关系抽取(Relationship Extraction, RE)是信息抽取的一个重要任务,其目标是从文本中抽取实体之间的关系。RE技术发展历程主要有以下几个阶段:1. 规则与模…

初窥机器视觉与卷积神经网络

文章目录 1. 什么是卷积神经网络2. 卷积运算3. 池化层4. 卷积神经网络的整体架构 1. 什么是卷积神经网络 卷积神经网络(convolutional neural network&#xff0c;CNN)主要用于计算机视觉相关任务&#xff0c;但处理对象并不局限于图像&#xff0c;CNN在序列和语音等上的应用也…

2023年陕西省《网络建设与运维》技能大赛试题

项目简介: 某集团公司原在北京建立了总公司,后在成都建立了分公司,广东设立了办事处。集团设有产品、营销、法务、财务、人力5个部门,全网采用OSPF、RIP、ISIS、BGP路由协议进行互联互通。集团在北京建立两个数据中心,贵州建立异地灾备数据中心。 公司网络拓扑如图1所示,…

功能要进阶自动化测试,你必须要了解的十大自动化测试框架

什么是自动化测试框架&#xff1f; 自动化测试框架&#xff0c;即是应用于自动化测试所用的框架。按照框架的定义&#xff0c;自动化测试框架要么是提供可重用的基础自动化测试模块&#xff0c;如&#xff1a;selenium 、watir等&#xff0c;它们主要提供最基础的自动化测试…

【Python入门篇】——Python中循环语句(while循环的嵌套应用,嵌套案例)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

监控系统经典架构详解

要了解一个监控系统那么我们就先要了解他的架构&#xff0c;看看监控系统是由哪些模块组成&#xff0c;各个模块是如何相互协调。我们将众多主流监控系统架构进行逻辑抽象和概括。 典型架构 从上图&#xff08;监控系统经典架构图&#xff09;来看&#xff0c;从左往右&#x…

Android RecyclerView实现吸顶动态效果

文章目录 一、ItemDecoration二、实现RecyclerView吸顶效果1、实现一个简单的RecyclerView2、通过ItemDecoration画分割线3、画出每个分组的组名4、实现吸顶效果 完整demo 链接:https://download.csdn.net/download/JasonXu94/87786702 一、ItemDecoration ItemDecoration 允…

python实现学生成绩管理程序,包含各科成绩的录入,计算各个学生的总分和平均分,统计各个科目的最高分、最低分和平均分。

一、编程题目 编程题目&#xff1a;使用python实现学生各科成绩的录入&#xff0c;计算各个学生的总分和平均分&#xff0c;统计各个科目的最高分、最低分和平均分。其中学生人数通过输入来决定&#xff0c;科目包括语文、数学和英语这三门课程。&#xff08;保留一位小数&…

JavaEE 5 (4/28)

1.wait() 和notify() 调用wait后做的三件事 1.释放锁 2.等待其他线程通知 3.收到通知后重新上锁,继续执行 要想实用wait和notify就得搭配synchronized 获取锁 wait哪个对象就要针对哪个对象加锁 Java中线程是随机抢占式执行的,实际上线程的执行我们一定要有一个顺序. join可以…

阿里云服务器可以做什么?十大使用场景举例说明

使用阿里云服务器可以做什么&#xff1f;阿里云百科分享使用阿里云服务器常用的十大使用场景&#xff0c;说是十大场景实际上用途有很多&#xff0c;阿里云百科分享常见的云服务器使用场景&#xff0c;如本地搭建ChatGPT、个人网站或博客、运维测试、学习Linux、跑Python、小程…

【2023秋招】2023华为od-4.20三道题

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

【刷题之路Ⅱ】LeetCode 622. 设计循环队列

LeetCode 622. 设计循环队列 一、题目描述二、解题1、方案1——数组实现&#xff0c;预留一个空判满1.1、成环思路1.2、初始化接口1.3、入队接口1.4、出队接口1.5、取队头接口1.6、取队尾接口1.7、判空接口1.8、判满接口1.9、释放接口 2、方案2——单向循环链表实现&#xff0c…

SpringBoot集成Oracle实战和坑

这里写目录标题 前言1.导包2. 配置文件&#xff1a;数据库信息辟谣 3.代码 问题更新 前言 前段时间搞了一个oracle的项目&#xff0c;耗费了很多时间&#xff0c;现在项目整体上线了&#xff0c;在此记录下实战过程以及遇到的坑&#xff0c;有需要的网友也可以直接拿去使用。 …

文本三剑客正则表达式1

文章目录 文本三剑客&正则表达式11 sort1.1 sort -f1.2 sort -b1.3 sort -n1.4 sort -r1.5 sort -u1.6 sort -t1.7 sort -k1.8 sort -o 2 uniq2.1 uniq -c2.2 uniq -u2.3 uniq -d 3 tr3.1tr -c3.2 tr -d3.3 tr -s :3.4 tr -t 4 cut4.1 cut -d4.2 cut -f4.3 cut -b4.4 cut -…

基于 SpringBoot+Vue 的家政服务管理平台

1. 背景 本系统主要是设计出家政服务管理平台&#xff0c;基于B/S构架&#xff0c;后台数据库采用了Mysql&#xff0c;可以使数据的查询和存储变得更加有效&#xff0c;可以确保家政服务管理的工作能够正常、高效的进行&#xff0c;从而提高工作的效率。总体的研究内容如下&am…

模组uart调试总结

配置驱动选项 1.1 首先通过原理图确定其串口号&#xff0c;比如UART1、UART3_HS&#xff0c;同时查看该串口引脚是否有复用功能&#xff0c;比如用作SIM卡引脚。如果有复用&#xff0c;需要在设备树配置中取消复用功能的选项&#xff0c;然后选中串口功能&#xff0c;高通平台设…

【嵌入式环境下linux内核及驱动学习笔记-(12-设备树操作函数)】

目录 1、设备树对应的数据结构1.1 struct device_node1.2 struct property 2、设备树操作函数2.1 查找字点的函数2.1.1 of_find_node_by_path2.1.2 of_find_node_by_name2.1.3 of_find_node_by_type2.1.4 of_find_compatible_node2.1.5 of_find_node_by_phandle2.1.6 of_get_ch…

Automa爬取网页数据直接入库(四)

介绍 在使用automa浏览器插件爬取数据时,可以直接通过发送请求将爬取到的网页数据持久化到数据库中 本次以360趋势图爬取后插入数据库当做测试 建立流程 首先建立打开360趋势图的流程,这个不再演示,直接从获取分析元素开始 打开要爬取的网页 点击定位元素 建立表格存储爬取…