欢迎来到这篇带有贬义标题的文章。
但是,在这篇文章中,我想以一种非常简单的方式向您解释编程的这两个特征,这次使用我最喜欢的编程语言 GOLANG.
让我们想象一个厨房:
煮菜:这个代表一个任务。
厨师:他是加工者。
同意:
厨房里有几位厨师:每人准备不同的菜肴。
在 Go 中:每个厨师都是一个 goroutine。虽然厨房(处理器)只有一台烤箱,但厨师可以同时处理菜肴,在等待烤箱可用的同时花时间处理其他任务。
并行度:
各种烤箱:每个厨师都有自己的烤箱。
在 Go 中:如果我们有多个物理处理器,每个 goroutine 可以在不同的处理器上运行,在现实生活中同时烹饪多个菜肴。
有什么区别?
并发:即使在单个处理器上,任务也是交织执行的,给人一种并行的错觉。
并行性:任务在多个处理器上同时运行,这显着加快了进程。
如何在 Go 中使用它们?
Goroutines:它们就像轻线程。要创建 goroutine,我们只需在函数之前使用 go 关键字:
让我们看一个如何在 golang 中使用 goroutine 的示例:
go func() { // Código que se ejecutará en una goroutine }()
Channels:这些是 goroutine 可以进行通信和同步的管道。
想象一下它们是在厨师之间传递原料的管子
ch := make(chan int) go func() { ch实际例子:
package main import ( "fmt" "time" ) func worker(id int, c chan int) { for n := range c { fmt.Printf("Worker %d received %d\n", id, n) time.Sleep(time.Second) } } func main() { c := make(chan int) for i := 1; i此代码的输出将是
Worker 1 received 1 Worker 2 received 2 Worker 3 received 3 Worker 4 received 4 Worker 5 received 5 Worker 1 received 6 Worker 2 received 7 Worker 3 received 8 Worker 4 received 9 Worker 5 received 10虽然有时可能看起来像这样
Worker 5 received 1 Worker 1 received 3 Worker 2 received 2 Worker 4 received 5 Worker 3 received 4 Worker 3 received 6 Worker 5 received 10 Worker 2 received 8 Worker 4 received 7 Worker 1 received 9或者像这样
Worker 5 received 1 Worker 1 received 2 Worker 2 received 3 Worker 3 received 4 Worker 4 received 5 Worker 1 received 6 Worker 2 received 7 Worker 3 received 8 Worker 5 received 9 Worker 4 received 10为什么每次运行程序时输出都会改变?
程序输出随着每次执行而变化的主要原因是并发的不确定性。
这是正在发生的事情的详细信息:
创建通道:make(chan int) 创建一个整数通道。该通道将用于 goroutine 之间的通信。
启动goroutines:循环 for i := 1;我 工作函数接收 ID 和通道。
发送值到通道:循环 for n := 1; n 1 到 10 的值发送到通道。
关闭通道:close(c)调用关闭通道,表示不再发送任何值。
从通道接收值:每个 goroutine 使用 for n := range c 循环从通道接收值。当接收到一个值时,它会被打印到控制台。
等待 goroutine 完成: time.Sleep(time.Second) 调用确保主 goroutine 在退出之前等待其他 goroutine 完成。
到目前为止:
我们创建 5 个 goroutine(cooks),它们通过通道接收数字。
我们将数字发送到频道供厨师处理。
厨师们同时工作,在收到数据时对其进行处理。为什么在 Go 中使用并发和并行?
更好的性能:特别是在 I/O 密集型任务中(例如读取文件或发出 HTTP 请求)。
提高响应能力:当任务被阻止时,应用程序可以继续响应其他请求。
更具可扩展性的架构:您可以跨多个核心或机器分配工作。记住!
并发和并行性是强大的工具,但它们也会使代码更难以理解和调试。仔细使用它们并理解它们的含义非常重要。
您想深入了解某个特定主题吗?
我们可以探索以下概念:
同步:互斥体、工作组等
并发模式:生产者-消费者、管道等
并发测试:如何有效测试并发代码。问候,
卢卡托尼·劳达莱斯X/Twitter
GitHub
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3