技术文摘
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语言开发者更好地应对复杂的并发需求。
- 怎样在MySQL中把SPACE()函数与列数据结合使用
- MySQL 中 IS 和 IS NOT 运算符的用途
- 如何从 MySQL 表中获取特定行作为输出
- MySQL NULL 安全等于运算符与行比较一起使用时的执行方式
- MySQL COALESCE() 函数首个参数为空白而非 NULL 时返回值是什么
- 在MySQL中使用mysql_ssl_rsa_setup创建SSL/RSA文件
- 怎样区分 MySQL 的 IFNULL() 与 NULLIF() 函数
- 在MySQL中如何判断一个列是否为自增列
- 默认约束的作用及在创建表时如何应用于列
- 在 CONCAT_WS() 函数中使用 NULL 作为参数、参数之一及分隔符时 MySQL 的返回值
- 使用测试数据库存在哪些缺点
- 如何获取MySQL查询影响的总行数
- MySQL DISTINCT 子句如何与 WHERE 和 LIMIT 子句一同使用
- INT数据类型中ZEROFILL的用途
- 什么是用户默认的MySQL数据库