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 · 2506 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3705 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 05:04 · PVG 13:04 · LAX 21:04 · JFK 00:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.