Go语言限制并发任务数量且每次最多执行40个任务的方法

2025-01-09 02:21:50   小编

在Go语言的开发过程中,常常会遇到需要限制并发任务数量的场景。比如,在处理大量数据时,如果并发任务过多,可能会导致系统资源耗尽,性能下降。本文将详细介绍如何在Go语言中限制并发任务数量,且每次最多执行40个任务。

我们可以借助Go语言的sync.WaitGroupsync.Semaphore来实现这一需求。sync.WaitGroup用于等待一组 goroutine 完成,而sync.Semaphore则可以用来控制并发的数量。

以下是一个示例代码:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    semaphore := make(chan struct{}, 40)

    tasks := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50}

    for _, task := range tasks {
        wg.Add(1)
        semaphore <- struct{}{}
        go func(t int) {
            defer wg.Done()
            defer func() { <-semaphore }()

            // 模拟任务执行
            fmt.Printf("Task %d is running\n", t)
        }(task)
    }

    wg.Wait()
    fmt.Println("All tasks are completed")
}

在这段代码中,我们首先创建了一个容量为40的semaphore通道。这个通道就像是一个许可证池,每个struct{}{}代表一个许可证。

接着,遍历任务列表,为每个任务添加到wg中,并从semaphore通道获取一个许可证(即发送一个空结构体到通道中)。然后启动一个 goroutine 来执行任务。

在 goroutine 内部,使用defer语句在任务完成时将许可证放回semaphore通道,并标记wg中的任务完成。

最后,通过wg.Wait()等待所有任务完成。

通过这种方式,我们有效地限制了并发任务的数量,确保每次最多只有40个任务同时执行。这种方法不仅能提高系统的稳定性,还能充分利用系统资源,提升整体性能。无论是在数据处理、网络请求还是其他需要并发操作的场景中,都能发挥很好的作用。掌握这一技巧,能让Go语言开发者更好地应对复杂的并发需求。

TAGS: GO语言 并发任务限制 任务数量控制 最多40个任务

欢迎使用万千站长工具!

Welcome to www.zzTool.com