golang限制最大并发数的方法是什么

avatar
作者
筋斗云
阅读量:2

在Go语言中,可以使用sync.WaitGroupchan来限制最大并发数。

  1. 使用sync.WaitGroupsync.WaitGroup是一个计数器,用来等待一组goroutine完成任务。可以在每个goroutine开始执行前调用Add()方法增加计数器,然后在goroutine执行结束时调用Done()方法减少计数器,最后可以调用Wait()方法等待所有的goroutine完成。

以下是一个使用sync.WaitGroup限制最大并发数的示例代码:

package main  import ( 	"fmt" 	"sync" 	"time" )  func main() { 	// 设置最大并发数为3 	maxConcurrency := 3  	// 创建一个等待组 	var wg sync.WaitGroup  	// 创建一个通道用于控制最大并发数 	sem := make(chan struct{}, maxConcurrency)  	// 创建10个任务 	for i := 0; i < 10; i++ { 		wg.Add(1)  		// 将任务添加到通道中 		sem <- struct{}{}  		go func(i int) { 			// 执行任务 			fmt.Println("Task", i, "start") 			time.Sleep(time.Second) 			fmt.Println("Task", i, "done")  			// 任务完成后从通道中移除 			<-sem  			// 完成任务 			wg.Done() 		}(i) 	}  	// 等待所有任务完成 	wg.Wait() } 
  1. 使用chanchan是Go语言中的通道,可以用来进行goroutine之间的通信。通过创建一个指定缓冲大小的通道,可以限制最大并发数。

以下是一个使用chan限制最大并发数的示例代码:

package main  import ( 	"fmt" 	"time" )  func main() { 	// 设置最大并发数为3 	maxConcurrency := 3  	// 创建一个通道用于控制最大并发数 	sem := make(chan struct{}, maxConcurrency)  	// 创建10个任务 	for i := 0; i < 10; i++ { 		// 将任务添加到通道中 		sem <- struct{}{}  		go func(i int) { 			// 执行任务 			fmt.Println("Task", i, "start") 			time.Sleep(time.Second) 			fmt.Println("Task", i, "done")  			// 任务完成后从通道中移除 			<-sem 		}(i) 	}  	// 等待所有任务完成 	for i := 0; i < maxConcurrency; i++ { 		sem <- struct{}{} 	} } 

这样可以确保同一时间最多同时执行maxConcurrency个goroutine。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!