我正确关闭此功能吗?

时间:2016-02-29 19:28:42

标签: go

几个小时后我发现有太多打开文件的错误。

我已经编辑过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()
}()

1 个答案:

答案 0 :(得分:1)

使用像advises这样的defer语句:

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)
}