几个小时后我发现有太多打开文件的错误。
我已经编辑过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 :(得分: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)
}