golang goroutine例子[golang并发代码片段]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang goroutine例子[golang并发代码片段]相关的知识,希望对你有一定的参考价值。

	var (
		Lock sync.Mutex
		Wait sync.WaitGroup
		routineNum int = 24 //concurrency control
		Ch           = make(chan int, routineNum)
	)

	var NodeProxysMap = make(map[string][]map[string]GateWayBase)
	for _, node := range nodeList.Items {
		Ch <- 1
		Wait.Add(1)
		go func(node api.Node, done func()){
			defer util.HandleCrash()
			defer done()
			proxyMap, err := GetProxy(node)
			if err != nil {
				glog.Errorf("node id: %s, get proxy map error: %v", node.UID, err)
				return
			}
			Lock.Lock()
			NodeProxysMap[node.UID] = append(NodeProxysMap[node.UID], proxyMap)
			Lock.Unlock()
		}(node, func(){
			<- Ch
			Wait.Done()
		})
	}
	Wait.Wait()

golang 多协程注意事项

参考技术A 实验100000个goroutines和cpu个数goroutines、单线程进行对比

运行结果:

1.100000个goroutines时间过长,主要原因是因为线程上下文切换有延迟代价。显然100000个goroutines处理这种cpu-bound的工作很不利。io-bound处理可以在io wait的时候去切换别的线程做其他事情,但是对于cpu-bound,它会一直处理work,线程切换会损害性能。
2.cpu数量goroutines时间过长,主要原因是false sharing(cache伪共享),每个core都会去共享变量c的相同cache行,频繁操作c会导致内存抖动(cache和主存直接的换页操作),在golang程序中需要避免因为cache伪共享导致的内存抖动,尽量避免多个线程去频繁操作一个相同变量或者是地址相邻变量。

以上是关于golang goroutine例子[golang并发代码片段]的主要内容,如果未能解决你的问题,请参考以下文章

Golang 如何防止 goroutine 泄露

Golang 如何防止 goroutine 泄露

Golang 多goroutine异步通知error的一种方法

Golang基础_11-并发concurrency

golang Golangでgoroutine

Golang 游戏leaf系列(六) Go模块