小白写的一个并发判断函数,请问有没有什么可以优化的地方 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Askiz
V2EX    Go 编程语言

小白写的一个并发判断函数,请问有没有什么可以优化的地方

  •  
  •   Askiz 2022-07-18 22:22:55 +08:00 3119 次点击
    这是一个创建于 1261 天前的主题,其中的信息可能已经有所发展或是发生改变。
    18 条回复    2022-07-21 13:36:42 +08:00
    maocat
        1
    maocat  
       2022-07-18 23:26:42 +08:00 via iPhone
    为什么不用 errgroup
    Askiz
        2
    Askiz  
    OP
       2022-07-19 00:04:24 +08:00 via Android
    @maocat 谢谢解答,我试试
    Askiz
        3
    Askiz  
    OP
       2022-07-19 00:23:24 +08:00 via Android
    @maocat 看了一下 errGroup 的用法,虽然也可以代替 waitgroup ,但是好像和 errGroup 的定义即有错误就退出的应用场景有点不太相符吧?
    Trim21
        4
    Trim21  
       2022-07-19 02:03:01 +08:00 via Android   1
    你这样给 result 赋值可能会因为 data race 而 panic 吧
    Trim21
        5
    Trim21  
       2022-07-19 02:18:41 +08:00 via Android
    既然都用了 wait group 了为什么 MultiJudge 还要额外用 resultChan 来控制,为什么不直接把 wg.Wait 移到外面来,删掉 result chan ?

    或者直接用 result chan 来传递各个 goroutine 的结果,还能避免并发读写的问题。
    wheeler
        6
    wheeler  
       2022-07-19 07:37:24 +08:00 via iPhone
    @Trim21 这里 result data race 会 panic ?我以为是未定义呢。
    djoiwhud
        7
    djoiwhud  
       2022-07-19 08:17:12 +08:00 via Android
    result 确实会 panic

    这两个函数没一个字的注释,我敢说,你自己都没想明白到底是要做什么。

    最大的问题是写的太嗦。实际项目上不会这么写。
    love2020
        8
    love2020  
       2022-07-19 08:59:39 +08:00
    前面大佬说了 result 共享内存了都, 玩的什么皮
    Askiz
        9
    Askiz  
    OP
       2022-07-19 09:09:31 +08:00 via Android
    @Trim21 这个其实做的是 if(judge1(value) || judge2(value) || judge3(value)) 这样的判断,如果有一个返回真其他就不继续等待结果了,所以我把 wg.Wait()放到协程里去了
    Trim21
        10
    Trim21  
       2022-07-19 12:32:37 +08:00
    @wheeler 的确是未定义,开了 -race 才会报错
    Trim21
        11
    Trim21  
       2022-07-19 13:19:36 +08:00   1
    @Askiz #9 你的 gorountine 里面就没必要写 resultChan <- ,这些 router 都已经运行完了 judgeFunc(value),为什么还要阻塞呢。

    https://gist.github.com/Trim21/157f85d710dae45e29d7c10504a4c93d

    atomic 没给 bool 类型,就直接用 int32 了
    Askiz
        12
    Askiz  
    OP
       2022-07-19 14:12:52 +08:00 via Android
    @Trim21 多谢大佬的指导
    Askiz
        13
    Askiz  
    OP
       2022-07-19 14:37:06 +08:00 via Android
    因为我想有一个 judgefunc 为这真就马上返回结果,不等待其他协程运行结束,所以把 wg.wait 放到协程里,如果都不为真,wg.wait 语句结束后会往 resultchan 里传值,外面语句接收到信号后才返回结果 false
    zjj19950716
        14
    zjj19950716  
       2022-07-19 16:33:03 +08:00   1
    搞个 judgefuncs 次长度的 resultChan ,就在外面读 judgefuncs 次 resultChan , 有 true 就返回 true ,一轮下来都没就 false 。
    MatthewMurdock
        15
    MatthewMurdock  
       2022-07-19 18:50:27 +08:00
    https://gist.github.com/murDDock/a89734f2378bf433d18c9f6a814e7918 我稍微修改了一下 有点嗦 我也不太行 一起学习
    Askiz
        16
    Askiz  
    OP
       2022-07-19 20:53:21 +08:00
    https://gist.github.com/mingkwind/fdbf7d076a6677d3d89bdc06c49053bd
    采取 4P/14P/15P 的意见,改完差不多是这样
    eastphoton
        17
    eastphoton  
       2022-07-19 20:54:24 +08:00
    说句难听的,充满了脱裤子放屁。。。
    js2854
        18
    js2854  
       2022-07-21 13:36:42 +08:00
    errgroup +1
    关于     帮助文档   &nsp; 自助推广系统     博客     API     FAQ     Solana     983 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:46 PVG 06:46 LAX 14:46 JFK 17:46
    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