求 go 并发限制的最佳实现

2021 年 2 月 8 日
 monkeyWie

情况如下: 有 N 个任务,每个任务执行完都会返回结果或者 error,通过固定的(M)协程去执行,如果其中有一个任务返回 error 时立即结束,否则全部执行完成时返回结果列表。

我自己写了一版,感觉有点复杂:https://play.golang.org/p/ono1S04XupK

不知道各位有没有什么更简单的实现。

7931 次点击
所在节点    Go 编程语言
70 条回复
monkeyWie
2021 年 2 月 10 日
@teawithlife #59 额,确实是 N 个协程,不过稍微改下就行了,把信号量控制放在循环里面
https://play.golang.org/p/SP7a8MaDd8B
MilletChili
2021 年 2 月 10 日
感觉不需要写太多代码,直接用 channel 控制就好了
https://play.golang.org/p/JiD2EopqPkL
monkeyWie
2021 年 2 月 10 日
@MilletChili #62 这种思路好像也不错,不过如果要加上参数传递和结果、错误返回也还是挺复杂的
monkeyWie
2021 年 2 月 10 日
@MilletChili #62 可以尝试下用这种思路实现下这里的 run 方法,https://play.golang.org/p/Be7vNF4JH4-
MilletChili
2021 年 2 月 10 日
@monkeyWie 嗯嗯,真要项目搞,还是用一些开源包好点
troywinter
2021 年 2 月 10 日
控制并发直接用 Semaphore 就行了,至于遇到错误怎么退出 goroutine 应该是你的业务代码自己实现,不同业务场景需要有不同的处理。
YouLMAO
2021 年 2 月 11 日
errgroup.withcontext 楼主是不是没学过 go 呀? 这样只要一个 err,context 就会取消,全部都返回了
tolerance
2021 年 2 月 13 日
把 channel 关了就可以
kevinwan
2021 年 2 月 17 日
go-zero 下有个 mr 包解决这种场景,遇到 error 可以 cancel 所有任务
abccccabc
2021 年 2 月 19 日
各位问一下,你们是怎样看 play.golang.org/p/xxxxxx 代码的?难道要 pa 强??

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

https://study.congcong.us/t/752304

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

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

© 2021 V2EX