首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有两个输入但只有一个输出的一个缓冲器会发生戈鲁廷泄漏吗?

有两个输入但只有一个输出的一个缓冲器会发生戈鲁廷泄漏吗?
EN

Stack Overflow用户
提问于 2017-12-04 04:05:30
回答 1查看 62关注 0票数 1

我有一个函数,用于在两个io.ReadWriter之间转发一条消息。一旦发生错误,我需要记录错误并返回。但我想我的代码中可能有一个戈鲁蒂泄漏问题:

代码语言:javascript
复制
func transport(rw1, rw2 io.ReadWriter) error {
    errc := make(chan error, 1) // only one buffer
    go func() {
        _, err := io.Copy(rw1, rw2)
        errc <- err
    }()

    go func() {
        _, err := io.Copy(rw2, rw1)
        errc <- err
    }()

    err := <-errc // only one error catched
    if err != nil && err == io.EOF {
        err = nil
    }
    return err
}

因为这个函数只有一个错误,那么第二个goroutine是否会正常地退出和垃圾处理?或者我应该多写一个err <- errc来接收另一个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-04 04:10:38

接收来自一个goroutine的值,另一个被缓冲。两只猩猩都可以发送到通道并退出。没有泄漏。

您可能希望接收两个值,以确保应用程序在要发送的第一个goroutine成功且第二个goroutine遇到错误时检测到错误。

代码语言:javascript
复制
var err error
for i := 0; i < 2; i++ {
  if e := <-errc; e != nil {
    err = e
  }
}

因为io.Copy不返回io.EOF,所以在收集错误时不需要检查io.EOF。

代码可以简化为使用单个goroutine:

代码语言:javascript
复制
errc := make(chan error, 1)
go func() {
    _, err := io.Copy(rw1, rw2)
    errc <- err
}()

_, err := io.Copy(rw2, rw1)

if e := <-errc; e != nil {
   err = e
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47626333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档