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

2022-07-18 22:22:55 +08:00
 Askiz
2516 次点击
所在节点    Go 编程语言
18 条回复
maocat
2022-07-18 23:26:42 +08:00
为什么不用 errgroup
Askiz
2022-07-19 00:04:24 +08:00
@maocat 谢谢解答,我试试
Askiz
2022-07-19 00:23:24 +08:00
@maocat 看了一下 errGroup 的用法,虽然也可以代替 waitgroup ,但是好像和 errGroup 的定义即有错误就退出的应用场景有点不太相符吧?
Trim21
2022-07-19 02:03:01 +08:00
你这样给 result 赋值可能会因为 data race 而 panic 吧
Trim21
2022-07-19 02:18:41 +08:00
既然都用了 wait group 了为什么 MultiJudge 还要额外用 resultChan 来控制,为什么不直接把 wg.Wait 移到外面来,删掉 result chan ?

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

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

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

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

atomic 没给 bool 类型,就直接用 int32 了
Askiz
2022-07-19 14:12:52 +08:00
@Trim21 多谢大佬的指导
Askiz
2022-07-19 14:37:06 +08:00
因为我想有一个 judgefunc 为这真就马上返回结果,不等待其他协程运行结束,所以把 wg.wait 放到协程里,如果都不为真,wg.wait 语句结束后会往 resultchan 里传值,外面语句接收到信号后才返回结果 false
zjj19950716
2022-07-19 16:33:03 +08:00
搞个 judgefuncs 次长度的 resultChan ,就在外面读 judgefuncs 次 resultChan , 有 true 就返回 true ,一轮下来都没就 false 。
MatthewMurdock
2022-07-19 18:50:27 +08:00
https://gist.github.com/murDDock/a89734f2378bf433d18c9f6a814e7918 我稍微修改了一下 有点啰嗦 我也不太行 一起学习
Askiz
2022-07-19 20:53:21 +08:00
https://gist.github.com/mingkwind/fdbf7d076a6677d3d89bdc06c49053bd
采取 4P/14P/15P 的意见,改完差不多是这样
eastphoton
2022-07-19 20:54:24 +08:00
说句难听的,充满了脱裤子放屁。。。
js2854
2022-07-21 13:36:42 +08:00
errgroup +1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX