技术文摘
Go语言限制并发任务数量且每次最多执行40个任务的方法
2025-01-09 02:21:50 小编
在Go语言的开发过程中,常常会遇到需要限制并发任务数量的场景。比如,在处理大量数据时,如果并发任务过多,可能会导致系统资源耗尽,性能下降。本文将详细介绍如何在Go语言中限制并发任务数量,且每次最多执行40个任务。
我们可以借助Go语言的sync.WaitGroup和sync.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语言开发者更好地应对复杂的并发需求。
- 七段小代码:玩转 Java 程序常见崩溃场景
- Python 中 12 种降维算法的实现
- Nacos 使用的详细解读 值得收藏
- 动态内存管理与防御性编程实践
- 为何越来越多人青睐 Tailwindcss
- 面试攻坚:Lock、TryLock、LockInterruptibly的差异解析
- Python 小工具:五分钟搞定一天工作,超棒
- Kubernetes 数字取证 DFIR 实用指引
- 手写 Css-Modules 以深入理解其原理
- Spring AOP 图文详细解析,你掌握了吗?
- 学会 TypeScript 实用工具类型的一篇文章
- 你了解 TypeScript 中的感叹号吗?
- 全新系统编程语言 Hare 发布 对标 C 语言
- 2022 年 JavaScript 开发工具生态状况
- 程序员以代码演绎刘畊宏龙拳