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

Go 中的并发模式;工作池和扇出/扇入

DDD
发布: 2024-10-07 22:11:01
原创
499 人浏览过

Concurrency patterns in Go; worker pools and fan-out/fan-in

Go 以其卓越的并发模型而闻名,但许多开发人员只关注 goroutine 和通道。然而,工作池和扇出/扇入等并发模式提供了真正的效率。

本文将介绍这些高级概念,帮助您最大限度地提高 Go 应用程序的吞吐量。

为什么并发很重要

并发允许程序高效地执行任务,特别是在处理 I/O 操作、Web 请求或后台处理等任务时。在 Go 中,goroutines 提供了一种轻量级的方法来管理数千个并发任务,但如果没有结构,您可能会遇到瓶颈。这就是工作池和扇出/扇入模式发挥作用的地方。

工人池

工作池允许您通过将任务分配给固定的“工作人员”来限制 goroutine 的数量。这可以防止超额订阅,减少资源消耗,并使任务执行易于管理。


package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {
    defer wg.Done()
    for j := range jobs {
        fmt.Printf("Worker %d started job %d\n", id, j)
        time.Sleep(time.Second) // Simulate work
        fmt.Printf("Worker %d finished job %d\n", id, j)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    var wg sync.WaitGroup

    // Start 3 workers
    for w := 1; w <= 3; w++ {
        wg.Add(1)
        go worker(w, jobs, results, &wg)
    }

    // Send jobs
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // Wait for workers to finish
    wg.Wait()
    close(results)

    for result := range results {
        fmt.Println("Result:", result)
    }
}


登录后复制

在此示例中:

  • 我们有三名工人同时处理作业。
  • 每个作业都会通过渠道传递给工人,并收集结果进行处理。

扇出/扇入模式

扇出/扇入模式允许多个 goroutine 处理同一任务,而扇入则将结果收集回单个输出。这对于划分任务然后聚合结果非常有用。


package main

import (
    "fmt"
    "sync"
    "time"
)

func workerFanOut(id int, tasks <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for task := range tasks {
        fmt.Printf("Worker %d processing task %d\n", id, task)
        time.Sleep(time.Second) // Simulate work
    }
}

func main() {
    var wg sync.WaitGroup
    tasks := make(chan int, 10)

    // Fan-out: Launch multiple workers
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go workerFanOut(i, tasks, &wg)
    }

    // Send tasks
    for i := 1; i <= 9; i++ {
        tasks <- i
    }
    close(tasks)

    // Wait for workers to finish
    wg.Wait()

    fmt.Println("All tasks are processed.")
}


登录后复制

在上面的代码中:

  • 扇出:我们创建多个并行处理任务的 goroutine(工作者)。
  • Fan-In:处理后,可以聚合所有worker的结果以进行进一步处理。

并发模式可用于优化 Web 服务器、批处理系统或 I/O 密集型应用程序。使用工作池和扇出/扇入等模式可确保最佳的资源利用率,而不会压垮系统容量。

增加知识的后续步骤:

  • 探索如何将这些模式扩展到其他并发挑战。
  • 使用管理请求的工作池构建实时 Web 服务。

Go 并发成功的关键是结构。掌握这些并发模式将提高您的 Go 技能并帮助您编写高性能应用程序。

请继续关注下一篇文章,了解更多关于 Go 的见解!

你可以给我买一本书来支持我:)

以上是Go 中的并发模式;工作池和扇出/扇入的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!