ZBLOG

golang 使用100个goroutine处理长度为10000的slice

下面是一个使用100个goroutine处理长度为10000的slice的示例代码:

package main

import (
	"fmt"
	"sync"
)

func processSlice(slice []int, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := range slice {
		slice[i] = slice[i] * 2
	}
}

func main() {
	var wg sync.WaitGroup
	sliceLength := 10000
	numGoroutines := 100
	slice := make([]int, sliceLength)

	// 初始化slice
	for i := range slice {
		slice[i] = i + 1
	}

	// 每个goroutine处理的slice长度
	chunkSize := sliceLength / numGoroutines

	// 启动goroutine
	for i := 0; i < numGoroutines; i++ {
		wg.Add(1)
		startIndex := i * chunkSize
		endIndex := (i+1)*chunkSize - 1
		go processSlice(slice[startIndex:endIndex+1], &wg)
	}

	// 等待所有goroutine完成
	wg.Wait()

	// 打印结果
	fmt.Println(slice)
}

该程序创建了一个长度为10000的整数slice,并使用100个goroutine并行地将每个元素乘以2。主函数使用sync.WaitGroup等待所有goroutine完成,然后打印结果。

在启动goroutine之前,主函数将slice分成了100个块,每个goroutine处理其中的一块。这样做是因为goroutine的数量比CPU核心的数量多得多,因此如果每个goroutine都操作整个slice,可能会导致竞争条件和性能问题。将slice分成块可以确保每个goroutine只处理自己负责的那一部分数据,避免了竞争条件。

请注意,这里使用defer wg.Done()在goroutine完成时递减WaitGroup计数器。这样做可以确保即使goroutine发生异常,也不会阻塞主线程等待所有goroutine完成。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=2305

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?