golang学习笔记——并发计算斐波纳契数

news/2024/10/23 18:35:22/

文章目录

  • 按顺序计算斐波纳契数
  • 并发计算斐波纳契数
  • 使用两个无缓冲 channel 的程序的第二个版本

按顺序计算斐波纳契数

golang学习笔记——将 channel 用作通信机制
golang学习笔记——并发计算斐波纳契数

package mainimport ("fmt""math/rand""time"
)func fib(number float64) float64 {x, y := 1.0, 1.0for i := 0; i < int(number); i++ {x, y = y, x+y}r := rand.Intn(3)time.Sleep(time.Duration(r) * time.Second)return x
}func main() {start := time.Now()for i := 1; i < 15; i++ {n := fib(float64(i))fmt.Printf("Fib(%v): %v\n", i, n)}elapsed := time.Since(start)fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

输出

1
1
2
3
5
8
13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!

并发计算斐波纳契数

实现并发的改进版本。完成此操作需要几秒钟的时间(不超过 15 秒),就像现在这样。 应使用有缓冲 channel。

package mainimport ("fmt""math/rand""time"
)func fib(number float64, ch chan string) {x, y := 1.0, 1.0for i := 0; i < int(number); i++ {x, y = y, x+y}r := rand.Intn(3)time.Sleep(time.Duration(r) * time.Second)ch <- fmt.Sprintf("Fib(%v): %v\n", number, x)
}func main() {start := time.Now()size := 15ch := make(chan string, size)for i := 0; i < size; i++ {go fib(float64(i), ch)}for i := 0; i < size; i++ {fmt.Printf(<-ch)}elapsed := time.Since(start)fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

输出

Fib(0): 1
Fib(3): 3
Fib(1): 1
Fib(12): 233
Fib(6): 13
Fib(7): 21
Fib(5): 8
Fib(8): 34
Fib(11): 144
Fib(10): 89
Fib(2): 2
Fib(9): 55
Fib(14): 610
Fib(4): 5
Fib(13): 377
Done! It took 2.0160237 seconds!

使用两个无缓冲 channel 的程序的第二个版本

使用两个无缓冲 channel:一个用于计算斐波纳契数,另一个用于等待用户的“退出”消息。 你需要使用 select 语句。

package mainimport ("fmt""time"
)var quit = make(chan bool)func fib(c chan int) {x, y := 1, 1for {select {case c <- x:x, y = y, x+ycase <-quit:fmt.Println("Done calculating Fibonacci!")return}}
}func main() {start := time.Now()command := ""data := make(chan int)go fib(data)for {num := <-datafmt.Println(num)fmt.Scanf("%s", &command)if command == "quit" {quit <- truebreak}}time.Sleep(1 * time.Second)elapsed := time.Since(start)fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

http://www.ppmy.cn/news/1239302.html

相关文章

macos端文件夹快速访问工具 Default Folder X 最新for mac

Default Folder X 是一款实用的工具&#xff0c;提供了许多增强功能和快捷方式&#xff0c;使用户能够更高效地浏览和管理文件。它的快速导航、增强的文件对话框、自定义设置和快捷键等功能&#xff0c;可以大大提升用户的工作效率和文件管理体验。 快速导航和访问&#xff1a;…

C++11的线程

线程的创建 用std::thread创建线程非常简单&#xff0c;只需要提供线程函数或者线程对象即可&#xff0c;并可以同时指定线程函数的参数。下面是创建线程的示例&#xff1a; #include <thread> #include <iostream> using namespace std;void func() {cout <<…

请手写一个发布-订阅的模式

发布-订阅模式也是经典的设计模式之一&#xff0c;它在前端很多地方都有应用&#xff0c;比如javascript事件池&#xff0c;Vue的$on、$off&#xff0c;nodejs的events模块和socket通信等等都有应用&#xff0c;也是前端面试比较火热的考点之一&#xff0c;接下来给大家详细介绍…

2023人形机器人行业海外科技研究:从谷歌看机器人大模型进展

今天分享的是人形机器人系列深度研究报告&#xff1a;《2023人形机器人行业海外科技研究&#xff1a;从谷歌看机器人大模型进展》。 &#xff08;报告出品方&#xff1a;华鑫证券&#xff09; 报告共计&#xff1a;26页 大模型是人形机器人的必备要素 长期来看&#xff0c;人…

3、Qt使用windeploy工具打包可执行文件

新建一个文件夹&#xff0c;把要打包的可执行文件exe拷贝过来 点击输入框&#xff0c;复制一下文件夹路径 点击电脑左下角&#xff0c;找到Qt文件夹&#xff0c; 点击打开 “Qt 5.12.0 for Desktop” &#xff08;我安装的是Qt 5.12.0版本&#xff09; 输入“cd bin”&#xff…

Java实现求最大值

1 问题 接收用户输入的3个整数&#xff0c;如何将最大值作为结果输出。 2 方法 采用“截图文字代码”的方式描述。 引入输入包调用main()函数&#xff0c;提示并接收用户输入的3个整数&#xff0c;并交由变量a b c来保存。对接收的3个数据进行比较&#xff0c;先比较a和b&#…

【Essential C++学习笔记】第六章 以Template进行编程

文章目录 第六章 以Template进行编程前言&#xff1a;6.1 被参数化的型别1&#xff09;为什么要有类模板呢?2&#xff09;具体实施 6.2 模板类的定义6.3 模板类型参数的处理6.4 实现一个模板类1&#xff09;实现逻辑1.理清思路2.insert()3.remove()4.remove_root()5.remove_va…

数据结构与算法编程题19

统计二叉树的叶结点个数。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 typedef struct BiNode {ElemType data;BiNode* lchild, * rchild; }BiNode,*BiTree;bool Create_tree(BiTre…