GoLang Channel与mutex的选择,性能差不多

原创 2015年11月17日 17:37:27

go官方应该是更推荐使用chan
https://github.com/golang/go/wiki/MutexOrChannel

以下代码用于测试性能 — 不确保思路是正确的。

package main

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

type Op struct {
    key int
    val int
}

var lock sync.Mutex

var m1 map[int]int
var m2 map[int]int
var max int = 50000

func update_map_by_mutex(i int) {
    lock.Lock()
    m1[i] = i
    if len(m1) == max {
        fmt.Printf("%s mutex finish\n", time.Now())
    }
    lock.Unlock()
}

var ch chan Op

func update_map_by_chan(i int) {
    ch <- Op{key: i, val: i}
}

func wait_for_chan(m map[int]int) {
    for {
        select {
        case op := <-ch:
            m[op.key] = op.val
            if len(m2) == max {
                fmt.Printf("%s chan finish\n", time.Now())
                return
            }
        }
    }
}

func main() {

    m1 = make(map[int]int, max)
    m2 = make(map[int]int, max)
    ch = make(chan Op)
    go wait_for_chan(m2)
    for i := 0; i < max; i++ {
        go update_map_by_chan(i)
        go update_map_by_mutex(i)
    }

    time.Sleep(time.Second * 1)
}

输出结果:

2015-11-17 17:08:18.06992 +0800 CST mutex finish
2015-11-17 17:08:18.0709215 +0800 CST chan finish

mutex性能略好,但chan更go化,更推荐。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

golang sync mutex 互斥锁

golang的多线程固然好用,但是有时候需要对数据进行上锁,防止数据被其它线程更改。那么sync包下的Mutex非常好用。 Mutex是一个互斥锁。可以作为struct的一部分,这样这个stru...

golang中sync.RWMutex和sync.Mutex区别

golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex  ...

golang使用之使用channel限制goroutine的数量

golang虽然启动一个goroutine很廉价但并不是可以无限制的使用的. 大多数的是用channel来限制goroutine的数量 写了一个测试DEMO如下: package main im...

[Golang]妙用channel

channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 chan...

golang语言并发与并行——goroutine和channel的详细理解(二)

Go语言的并发和并行 不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话: var quit chan int = make(chan int) func l...

Golang的select/非缓冲的Channel实例详解

select golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作。 在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接...

golang语言并发与并行——goroutine和channel的详细理解(一)

如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。 Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据...

Golang:有趣的 channel 应用

Golang:有趣的 channel 应用 http://mikespook.com/2012/06/golang-channel-%e6%9c%89%e8%b6%a3%e7%9a%84%e5%ba...

golang channel 学习

Go Channel1. 概述“网络,并发”是Go语言的两大feature。Go语言号称“互联网的C语言”,与使用传统的C语言相比,写一个Server所使用的代码更少,也更简单。写一个Server除了...

golang控制channel的出入口

golang控制channel的出入口我们常常使用channel来在多个goroutine之间做数据通讯,但是chan作为函数的入参我们应该怎么写呢?也许有人觉得这个问题比较傻,不过这个还真的是我今天...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)