溫馨提示×

golang限制最大并發(fā)數(shù)的方法是什么

小億
144
2023-10-26 01:01:39
欄目: 編程語言

在Go語言中,可以使用sync.WaitGroupchan來限制最大并發(fā)數(shù)。

  1. 使用sync.WaitGroupsync.WaitGroup是一個(gè)計(jì)數(shù)器,用來等待一組goroutine完成任務(wù)??梢栽诿總€(gè)goroutine開始執(zhí)行前調(diào)用Add()方法增加計(jì)數(shù)器,然后在goroutine執(zhí)行結(jié)束時(shí)調(diào)用Done()方法減少計(jì)數(shù)器,最后可以調(diào)用Wait()方法等待所有的goroutine完成。

以下是一個(gè)使用sync.WaitGroup限制最大并發(fā)數(shù)的示例代碼:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	// 設(shè)置最大并發(fā)數(shù)為3
	maxConcurrency := 3

	// 創(chuàng)建一個(gè)等待組
	var wg sync.WaitGroup

	// 創(chuàng)建一個(gè)通道用于控制最大并發(fā)數(shù)
	sem := make(chan struct{}, maxConcurrency)

	// 創(chuàng)建10個(gè)任務(wù)
	for i := 0; i < 10; i++ {
		wg.Add(1)

		// 將任務(wù)添加到通道中
		sem <- struct{}{}

		go func(i int) {
			// 執(zhí)行任務(wù)
			fmt.Println("Task", i, "start")
			time.Sleep(time.Second)
			fmt.Println("Task", i, "done")

			// 任務(wù)完成后從通道中移除
			<-sem

			// 完成任務(wù)
			wg.Done()
		}(i)
	}

	// 等待所有任務(wù)完成
	wg.Wait()
}
  1. 使用chanchan是Go語言中的通道,可以用來進(jìn)行g(shù)oroutine之間的通信。通過創(chuàng)建一個(gè)指定緩沖大小的通道,可以限制最大并發(fā)數(shù)。

以下是一個(gè)使用chan限制最大并發(fā)數(shù)的示例代碼:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 設(shè)置最大并發(fā)數(shù)為3
	maxConcurrency := 3

	// 創(chuàng)建一個(gè)通道用于控制最大并發(fā)數(shù)
	sem := make(chan struct{}, maxConcurrency)

	// 創(chuàng)建10個(gè)任務(wù)
	for i := 0; i < 10; i++ {
		// 將任務(wù)添加到通道中
		sem <- struct{}{}

		go func(i int) {
			// 執(zhí)行任務(wù)
			fmt.Println("Task", i, "start")
			time.Sleep(time.Second)
			fmt.Println("Task", i, "done")

			// 任務(wù)完成后從通道中移除
			<-sem
		}(i)
	}

	// 等待所有任務(wù)完成
	for i := 0; i < maxConcurrency; i++ {
		sem <- struct{}{}
	}
}

這樣可以確保同一時(shí)間最多同時(shí)執(zhí)行maxConcurrency個(gè)goroutine。

0