欢迎来到这篇带有贬义标题的帖子。
但是,在这篇文章中,我想以一种非常简单的方式向您解释编程的这两个特征,这次使用我最喜欢的编程语言GOLANG。
让我们想象一个厨房:
做饭:这代表一个任务。
厨师:他是一个加工者。
出席人数:
厨房里的几位厨师:每个人准备不同的菜肴。
在 Go 中:每个厨师都是一个 goroutine。虽然厨房(处理器)只有一台烤箱,但厨师们可以同时处理自己的菜肴,在等待烤箱可用的同时将时间花在其他任务上。
并行度:
各种烤箱:每个厨师都有自己的烤箱。
在 Go 中:如果我们有多个物理处理器,每个 goroutine 都可以在不同的处理器上运行,以真正的方式同时烹饪多个菜肴。
有什么区别?
并发:即使在单个处理器上,任务也是交织执行的,给人一种并行的错觉。
并行性:任务在多个处理器上同时运行,这显着加快了进程。
如何在 Go 中使用它们?
Goroutines:它们就像轻线程。要创建 goroutine,我们只需在函数前使用 go 关键字即可:
让我们看一个如何在 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中文网其他相关文章!