技术文摘
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语言开发者更好地应对复杂的并发需求。
- 正则表达式怎样提取并替换[url]标签里的相对路径
- ThinkPHP 中 Facade 模式怎样调用非静态方法
- Uniapp 每日签到功能实现:后端 PHP 与前端 Uniapp 交互全解析
- 用正则表达式替换[url]标签内相对路径的方法
- 接口签名中,空字符不参与签名及参数按ASCII码排序的原因
- PHP中用spl_autoload_register函数替代__autoload函数的方法
- 接口签名剔除空字符及进行参数排序的原因
- 正则表达式怎样替换URL标签里的相对路径
- Docker中ThinkPHP6定时任务无法创建日志,PHP权限问题解决方法
- MySQL存储过程参数错误之varchar(10)类型参数问题排查方法
- PHP 7.3.4中preg_replace()函数失效,正则表达式无法去除多余换行符原因何在
- Go语言数组与关联数组:Go如何实现类似PHP关联数组功能
- 用正则表达式匹配含单引号或双引号字符串且排除双引号中内容的方法
- 正则表达式实现特定字符串替换并添加前缀的方法
- Smarty模板变量嵌套:怎样实现变量值的动态获取