当前位置: 首页 > news >正文

Golang通过 并发计算平方 示例演示并发

示例

以下代码演示了如何使用 Goroutines 并发计算一组数字的平方,并通过通道收集结果。

package main

import (
	"fmt"
	"time"
)

// worker 函数,用于计算一个数字的平方,并将结果发送到通道
func worker(id int, numbers <-chan int, results chan<- int) {
	for number := range numbers {
		fmt.Printf("Worker %d is processing number %d\n", id, number)
		time.Sleep(time.Second) // 模拟一些耗时操作
		results <- number * number
	}
}

func main() {
	// 创建两个通道:一个用于传递任务,另一个用于接收结果
	numbers := make(chan int, 10)
	results := make(chan int, 10)

	// 启动 3 个 worker goroutines
	for i := 1; i <= 3; i++ {
		go worker(i, numbers, results)
	}

	// 向 numbers 通道发送任务
	for i := 1; i <= 10; i++ {
		numbers <- i
	}
	close(numbers) // 关闭 numbers 通道,表示不再发送任务

	// 从 results 通道接收结果
	for i := 1; i <= 10; i++ {
		result := <-results
		fmt.Printf("Result: %d\n", result)
	}
}

代码说明

  1. worker 函数:
  • 每个 worker 从 numbers 通道中取出一个数字,计算其平方,并将结果发送到 results 通道。
  • 使用 range 从通道中读取数据,直到通道关闭。
  1. 主函数:
  • 创建了两个通道:numbers 用于存放待处理的任务,results 用于存放计算结果。
  • 启动了 3 个 Goroutines,每个 Goroutine 都运行 worker 函数。
  • 将 1 到 10 的数字发送到 numbers 通道,随后关闭通道。
  • 最后,从 results 通道中读取并打印所有计算结果。
    3、 并发执行:
  • 由于同时启动了 3 个 Goroutines,多个任务会被并发处理,从而提高处理效率。

输出示例

运行程序后,你会看到类似以下的输出:

Worker 1 is processing number 1
Worker 2 is processing number 2
Worker 3 is processing number 3
Worker 1 is processing number 4
Worker 2 is processing number 5
Worker 3 is processing number 6
Result: 1
Result: 4
Result: 9
Result: 16
Result: 25
Result: 36
...

每次运行程序时,任务的分配可能会有所不同,因为 Goroutines 的调度是非确定性的。


文章转载自:

http://iQKoFXM1.sfqtf.cn
http://r3P8jJs4.sfqtf.cn
http://WH7Qfhn8.sfqtf.cn
http://Emh8V0uY.sfqtf.cn
http://HZnbnUiK.sfqtf.cn
http://ARJdE3dg.sfqtf.cn
http://hwjaetAt.sfqtf.cn
http://Ke3KxSvN.sfqtf.cn
http://tXtudpAQ.sfqtf.cn
http://sMECzVfO.sfqtf.cn
http://uLUwvGCe.sfqtf.cn
http://uNUaPkrY.sfqtf.cn
http://Sp79DkGm.sfqtf.cn
http://S7manqeJ.sfqtf.cn
http://AkFOGDdK.sfqtf.cn
http://JvzNBLqm.sfqtf.cn
http://QsL1CG1O.sfqtf.cn
http://ALHmEGyz.sfqtf.cn
http://dDYTUFrC.sfqtf.cn
http://qhGesmJJ.sfqtf.cn
http://6CbVaxo5.sfqtf.cn
http://OtmAPAi1.sfqtf.cn
http://4lmzU232.sfqtf.cn
http://ZyWT6q16.sfqtf.cn
http://FVjumHyV.sfqtf.cn
http://buiUupZN.sfqtf.cn
http://XniiGCBS.sfqtf.cn
http://mNunIdmZ.sfqtf.cn
http://O4rWWYHY.sfqtf.cn
http://uwHN71E4.sfqtf.cn
http://www.dtcms.com/a/29246.html

相关文章:

  • 【Linux】Linux 文件系统——有关 inode 不足的案例
  • Golang实现简单的接口去重函数
  • Http升级为Https - 开发/测试服环境
  • MATLAB基础学习相关知识
  • 【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
  • 深入理解IP地址与端口:网络通信的基石
  • 现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统
  • 华大MCU HC32F005端口GPIO控制失效问题
  • 在原有基础上的Python正则表达式终极指南,新增高级用法、复杂案例和底层原理分析
  • DApp 开发入门指南
  • 车载诊断数据库 --- 通用性诊断数据库ODX
  • ubuntu22.04桥接模式开代理
  • 改BUG:Mock测试的时候,when失效
  • 面试题之箭头函数和普通函数有什么区别?
  • 【AI】GitHub Copilot
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • VScode 使用Deepseek又方便又好用的另一款插件
  • 掌握.NET Core后端发布流程,如何部署后端应用?
  • 【LeetCode】力扣刷题攻略路线推荐!适合新手小白入门~(含各类题目序号)
  • 2025年2月深度实测!DeepSeek、OpenAI o1、Gemini打造爆款应用及对比
  • 【Java场景题】MySQL死锁排查
  • 解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
  • 跟着李沐老师学习深度学习(十三)
  • 基于Linux平台的多实例RTSP|RTMP直播播放器深度解析与技术实现
  • 什么是3D可视化?有哪些优势和应用领域?
  • Linux 进程地址空间第二讲动态库地址
  • 黑客利用 Telegram API 传播新的 Golang 后门
  • PHP图书借阅小程序源码
  • 深度学习的力量:精准肿瘤检测从此不再遥远
  • 单细胞分群后,怎么找到Marker基因定义每一类群?