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模块