首页 > 后端开发 > Golang > 正文

GO:傻瓜式并发与并行。

WBOY
发布: 2024-08-23 12:30:31
原创
715 人浏览过

欢迎来到这篇带有贬义标题的帖子。
但是,在这篇文章中,我想以一种非常简单的方式向您解释编程的这两个特征,这次使用我最喜欢的编程语言GOLANG

让我们想象一个厨房

做饭:这代表一个任务。
厨师:他是一个加工者。
出席人数:

厨房里的几位厨师:每个人准备不同的菜肴。
在 Go 中:每个厨师都是一个 goroutine。虽然厨房(处理器)只有一台烤箱,但厨师们可以同时处理自己的菜肴,在等待烤箱可用的同时将时间花在其他任务上。
并行度:

各种烤箱:每个厨师都有自己的烤箱。
在 Go 中:如果我们有多个物理处理器,每个 goroutine 都可以在不同的处理器上运行,以真正的方式同时烹饪多个菜肴。

有什么区别?

并发:即使在单个处理器上,任务也是交织执行的,给人一种并行的错觉。
并行性:任务在多个处理器上同时运行,这显着加快了进程。

如何在 Go 中使用它们?

Goroutines:它们就像轻线程。要创建 goroutine,我们只需在函数前使用 go 关键字即可:

GO: Concurrencia vs Paralelismo Para Tontos.

让我们看一个如何在 golang 中使用 goroutine 的示例:

go func() {
    // Código que se ejecutará en una goroutine
}()
登录后复制

通道:这些是 goroutine 可以进行通信和同步的管道。
想象一下它们是在厨师之间传递食材的管子

ch := make(chan int)
go func() {
    ch <- 42 // Enviar un valor por el canal
}()
value := <-ch // Recibir un valor del canal
登录后复制

实际示例:

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 <= 5; i++ {
        go worker(i, c)
    }

    for n := 1; n <= 10; n++ {
        c <- n
    }
    close(c)

    time.Sleep(time.Second)
}
登录后复制

这段代码的输出将是

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 之间的通信。

启动 goroutine:循环 for i := 1;我 工作函数接收 ID 和通道。

发送值到通道:n := 1 的循环; n 1 到 10 的值发送到通道。

关闭通道:close(c)调用关闭通道,表示不会再发送任何值。

从通道接收值:每个 goroutine 使用 for n := range c 循环从通道接收值。当接收到一个值时,它会被打印到控制台。

等待 goroutine 完成: time.Sleep(time.Second) 调用确保主 goroutine 在退出之前等待其他 goroutine 完成。

到目前为止

我们创建 5 个 goroutine(cook),通过通道接收数字。
我们将号码发送到频道供厨师处理。
厨师们同时工作,在收到数据时对其进行处理。

为什么在 Go 中使用并发和并行?

更好的性能:特别是在 I/O 密集型任务中(例如读取文件或发出 HTTP 请求)。
提高响应能力:任务锁定时应用程序可以继续响应其他请求。
更具可扩展性的架构:您可以跨多个核心或机器分配工作。

记住!

并发和并行性是强大的工具,但它们也会使代码更难以理解和调试。仔细使用它们并理解它们的含义非常重要。

您想深入了解某个特定主题吗?

我们可以探索以下概念:

同步:互斥体、工作组等
并发模式:生产者-消费者、管道等
并发测试:如何有效测试并发代码。

您好,
卢卡托尼·劳达尔斯

X/Twitter
GitHub

以上是GO:傻瓜式并发与并行。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板