首页 > 后端开发 > Golang > Go中如何保持固定数量的并发Goroutine?

Go中如何保持固定数量的并发Goroutine?

DDD
发布: 2024-12-06 09:15:10
原创
437 人浏览过

How to Maintain a Fixed Number of Concurrent Goroutines in Go?

维持固定数量的并发 Goroutine

在 Go 中,你可能会遇到控制并发运行的 Goroutine 数量至关重要的场景。虽然教程通常侧重于等待 goroutine 完成,但在任何给定时间实现特定数量的活动 goroutine 会带来不同的挑战。

考虑以下情况:您有数十万个任务需要处理。处理每个任务都需要有自己的 Goroutine,但是您的系统资源最多只能处理 20 个并发 Goroutine。您需要确保始终有 20 个 goroutine 运行,只要现有的 goroutine 完成,就启动一个新的 goroutine。

有界并行

为了实现这一目标,Go 并发模式文章建议使用一种称为“有限并行”的模式。它涉及使用空结构体通道作为保护来限制并发工作线程的数量。

实现

以下示例演示了如何实现此模式:

package main

import (
    "fmt"
    "sync"
)

func main() {
    const maxGoroutines = 20

    // Create a channel of empty structs to control worker count
    guard := make(chan struct{}, maxGoroutines)

    var wg sync.WaitGroup

    // Launch workers
    for i := 0; i < 30; i++ {
        wg.Add(1)
        guard <- struct{}{} // Blocks if guard channel is filled
        go func(n int) {
            defer wg.Done()
            worker(n)
            <-guard // Release slot in guard channel
        }(i)
    }
    wg.Wait()
}

func worker(i int) { fmt.Println("doing work on", i) }
登录后复制

在这个例子中,保护通道被用作令牌桶。可以同时运行的 Goroutine 的最大数量受到通道容量的限制(本例中为 20)。每个 goroutine 在开始工作之前都会从通道获取一个“令牌”(一个空结构)。当一个 goroutine 完成时,它将其令牌释放回通道,使其可供另一个 goroutine 获取。通过控制通道中 token 的数量,可以有效控制并发 goroutine 的数量。

以上是Go中如何保持固定数量的并发Goroutine?的详细内容。更多信息请关注PHP中文网其他相关文章!

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