2016-02-29 108 views
1

几个小时后,我有太多的打开的文件,我不断收到错误。我是否正确关闭此功能?

我已经编辑了ulimit -n,但似乎只是延长了发生错误之前的时间并使程序崩溃。

我相信我已经缩小到这个功能,我只是不确定我是否正确地关闭它。

我现在有一个功能

go func() { 
    if _, err := io.Copy(rw, stdout); err != nil { 
     if !WritePipeBroken.MatchString(err.Error()) && 
      !ConnectionResetByPeer.MatchString(err.Error()) { 
      rollbar.Error(rollbar.ERR, err) 
     } 
     log.Printf("pipeThruFfmpegToMp3: %v\n", err) 
     if err := ffmpeg.Process.Kill(); err != nil { 
      log.Printf("pipeThruFfmpegToMp3: %v\n", err) 
     } 
    } 
    rw.Flush() 
    wg.Done() 
}() 

我相信这是挂,所以我应该这样做,而不是

go func() { 
    if _, err := io.Copy(rw, stdout); err != nil { 
     if !WritePipeBroken.MatchString(err.Error()) && 
      !ConnectionResetByPeer.MatchString(err.Error()) { 
      rollbar.Error(rollbar.ERR, err) 
     } 
     log.Printf("pipeThruFfmpegToMp3: %v\n", err) 
     if err := ffmpeg.Process.Kill(); err != nil { 
      log.Printf("pipeThruFfmpegToMp3: %v\n", err) 
     } 
    } 
    if ffmpeg.Process != nil { 
     ffmpeg.Process.Kill() 
    } 
    if stdout != nil { 
     stdin.Close() 
    } 
    rw.Flush() 
    wg.Done() 
}() 
+0

什么是'rw'变量吗?另外,'Copy'函数有两个参数 - destination和source。你使用'stdout'作为显然是错误的来源。 – creker

+0

rw是''rw web.ResponseWriter''',在这种情况下不能确定使用''stdout'''是错误的,因为我正在管道应用 – nadermx

回答

1

使用defer声明像谷歌advises

func CopyFile(dstName, srcName string) (written int64, err error) { 
    src, err := os.Open(srcName) 
    if err != nil { 
     return 
    } 
    defer src.Close() 

    dst, err := os.Create(dstName) 
    if err != nil { 
     return 
    } 
    defer dst.Close() 

    return io.Copy(dst, src) 
} 
+0

使用延迟在这个用例中有更高的开销,所以不确定仅仅使用延迟就是正确的用例。 – nadermx

+1

@nadermx你指的是什么开销?没有理由为了节省几个纳秒而使这个功能变得更复杂。这正是你应该使用延期的情况。 – JimB