golang 多协程操作同一个 map 的方案哪个好 ?? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
dafsic

golang 多协程操作同一个 map 的方案哪个好 ??

  •  
  •   dafsic 2019 年 8 月 30 日 6441 次点击
    这是一个创建于 2421 天前的主题,其中的信息可能已经有所发展或是发生改变。

    多个协程读写 map,读多写少。(就是定时加载配置) 现在的方式是定义一个指针指向 map,tM = *map[int]*sT。

    然后读的时候,原子操作 load 这个指针: rM := (*map[int]*sT)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&tM))))

    写的时候,先创建一个 map ( tmp ),填好信息后,然后再原子操作: atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&tM)), unsafe.Pointer(&tmp))。

    除此之外,知道还有读写锁,sync.Map ,atomic.Value,不知道哪个性能最好?(即读的时候要快,因为有好多数据要通过这个 map 匹配)

    另外,如果是读写差不多的情况下,是不是 sync.Map 最合适?

    18 条回复    2019-10-09 13:02:00 +08:00
    cloverstd
        1
    cloverstd  
       2019 年 8 月 30 日   1
    sync.Map 适合你的描述
    dafsic
        2
    dafsic  
    OP
       2019 年 8 月 30 日
    @cloverstd 不知道 sync.Map 是怎么实现的,但肯定有一些同步的判断吧,所以每次读都会比正常的 map 要慢一点,数据一多,就会慢的多了。这样理解对不?
    polythene
        3
    polythene  
       2019 年 8 月 30 日
    这种情况的话,是 atomic.Value 最好,官方的示例程序就是你这里的场景。
    http://blog.betacat.io/post/golang-atomic-value-exploration/
    zzn
        4
    zzn  
       2019 年 8 月 30 日
    大多数时候加个锁并没有想象中那么慢,特别是本来就是读多的场景
    dafsic
        5
    dafsic  
    OP
       2019 年 8 月 30 日
    @polythene 之前看到过,想的是,每次读都要 load 一下,肯定不能比我一个原子操作还快吧。所以没用,当然这只是想的,没经过验证,不会基测。。。
    dafsic
        6
    dafsic  
    OP
       2019 年 8 月 30 日
    @zzn 现在 3 分钟内,150 万次读这个 map,如果每次读都加一个读锁,感觉开销有点大啊。也并没有要求那么高,数据来的比较集中,但有 kafka 做缓冲,所以可以慢点也没事,只是我想找一个性能最好的方式。
    lishunan246
        7
    lishunan246  
       2019 年 8 月 30 日 via Android
    每个 goroutine 每秒检查一次配置有没有更新就行了,没有必要跑一次读一次。
    hellodudu86
        8
    hellodudu86  
       2019 年 8 月 30 日
    sync.Map 最省心,缺点是没法用 len,也没法获取 size,只能在 Range 里面自己计数。
    hellodudu86
        9
    hellodudu86  
       2019 年 8 月 30 日
    用内建 map 读多写少的情况最好还是 sync.RWMutex
    boob
        10
    boob  
       2019 年 8 月 31 日 via Android
    @dafsic sync.map 比你快,大牛单手写的代码,用的是 cache,大部分情况不加锁的,c++,Java 新官方都开始学习这个
    boob
        11
    boob  
       2019 年 8 月 31 日 via Android
    标准问题尽量用 STL,如果你的平均性能超过 STL,直接入选 golang 技术委员会,
    reus
        12
    reus  
       2019 年 9 月 1 日
    写代码测试一下不就知道了。
    dafsic
        13
    dafsic  
    OP
       2019 年 9 月 2 日
    @boob 标准库未必就是性能最佳吧,就说 json,你用的是标准库中的?另外,sync.map 肯定不是为了多读少写场景设计的,如果说是 atomic.Value 到是,这个也是无锁的,看了他的实现,里面用了原子操作,还有判断逻辑,与内置的 map 比肯定差。
    dafsic
        14
    dafsic  
    OP
       2019 年 9 月 2 日
    @reus 实话,真不会测试。研究研究也应该能会,想着这个问题应该都有遇到过,如果别人梳理过,系统的测试过,更好。
    tourist2018
        15
    tourist2018  
       2019 年 9 月 2 日
    sync.Map
    sxfscool
        16
    sxfscool  
       2019 年 9 月 5 日
    @dafsic testing.B 了解以下
    javapythongo
        17
    javapythongo  
       2019 年 9 月 5 日
    用读写锁应该可以把
    dafsic
        18
    dafsic  
    OP
       2019 年 10 月 9 日
    @javapythongo 可以是都可以的,我想要性能最好的,读写锁应该是性能最差的。现在懒得去基测,等有遇到问题再研究。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5483 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 52ms UTC 07:22 PVG 15:22 LAX 00:22 JFK 03:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86