Go 语言中的错误(error)管理总是能引起争论,同时,在关于使用 Go 语言的时候,开发者面对最大的挑战的年度调查[1]中也是一个经常性的话题。然而,在并发环境处理 error 的场景下,或者在同一个 goroutine 中合并多个错误的场景下,Go 提供了很不错的包可以让多个错误的处理变得简单:来看看如何合并由单个 goroutine 生成的多个 error。

本文是 Go语言中文网组织的 GCTT 翻译,发布在 Go语言中文网公众号,转载请联系我们授权。

一个 goroutine,多个 error

当编写有着重试策略的代码时,将多个 error 合并为一个会十分有用,比如,下面是我们需要收集生成的 error 的一个基本例子:

这个程序读取并解析一个 CSV 文本,并且展示发现的错误。如果将 error 聚合为一个完整的报告,会更加方便。为了将错误合并为一个,我们可以在两个不错的包中进行选择:

使用 HashiCorp[2] 的 go-multierror[3] ,error 可以被合并为一个标准 error:

之后可以打印出一个报告:

使用 Uber[4] 的 multierr[5]:

这里的实现是类似的,这是输出:

error 通过分号连接,没有经过其他格式化。

关于两个包的性能,这是一个使用相同程序,有着更高次数失败的基准测试:

name                    time/op         alloc/op        allocs/op

HashiCorpMultiErrors-4  6.01µs ± 1%     6.78kB ± 0%     77.0 ± 0%

UberMultiErrors-4       9.26µs ± 1%     10.3kB ± 0%      126 ± 0%

Uber 的实现略慢,同时消耗更多内存。但是,这个包被设计为一次将错误聚合在一起,而不是每次都追加它们。在聚合 error 的时候,结果是接近的。但是由于需要额外步骤,代码有点不太优雅。这是新的结果:

name                    time/op         alloc/op        allocs/op

HashiCorpMultiErrors-4  6.01µs ± 1%     6.78kB ± 0%     77.0 ± 0%

UberMultiErrors-4       6.02µs ± 1%     7.06kB ± 0%     77.0 ± 0%

两个包都通过在自定义实现中实现了 Error() string 函数的方式利用了 Go 的 error 接口。

一个 error,多个 goroutine

在操作多个 goroutine 来处理一个任务的时候,为了保证程序的正确性,正确地管理结果和错误汇总是有必要的。

以一个程序开始,该程序使用多个 goroutine 执行一系列行为(action);每个行为持续一秒:

为了描绘 error 传播,第三个 goroutine 的第一个 action 会失败。这是发生的事情:

如同预期的一样,这个程序大致用了三秒钟,因为大多数 goroutine 需要经历三个 action,每一个需要一秒:

go run .  0.30s user 0.19s system 14% cpu 3.274 total

然而,我们可能希望使 goroutine 之间相互依赖,并且如果其中一个失败就取消他们。避免无谓工作的解决方案可以是加一个 context,并且,一旦一个 goroutine 失败,就会取消它:

这恰好就是 `errgroup`[6] 所提供的;当处理一组 goroutine 的时候,一个错误以及上下文传播。这是使用 `errgroup`[7] 包的新代码:

由于通过 error 传播了取消的上下文,这个程序现在运行地更快了:

go run .  0.30s user 0.19s system 38% cpu 1.269 total

这个包所带来的其他好处是,我们不需要再操心等待组的增加以及将 goroutine 标记为已完成。这个包为我们管理了这些,我们仅仅需要说明什么时候我们准备好了等待过程的结束。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月18日

热门专题

弥勒综合高中|弥勒综合高中
弥勒综合高中
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学
卓越综合高中|卓越综合高中
卓越综合高中
天麻的功效与作用吃法|天麻的功效与作用,天麻的功效与作用吃法,天麻炖什么治头痛最好,天麻的功效与作用禁忌,天麻多少钱一斤,天麻的功效与作用吃法及禁忌,天麻怎么吃效果最好,天麻粉的功效与作用,天麻怎么吃
天麻的功效与作用吃法
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
金诺幼儿园(春城路金诺幼儿园)|昆明官渡区幼儿园,幼儿园报名,官渡区幼儿园,春城路幼儿园,幼儿园招生,学前班,昆明幼儿园,金诺幼儿园,环城南路幼儿园,石井路幼儿园
金诺幼儿园(春城路金诺幼儿园)
云南网站建设|云南网站制作,网站建设,云南网站开发,云南网站设计,云南网页设计,云南网站建设公司,云南网站建设
云南网站建设

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部