2016-02-29 141 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