Try to optimize pipe performance

This commit is contained in:
风扇滑翔翼
2025-12-11 11:59:22 +00:00
committed by GitHub
parent a610a4c89a
commit d5f17ab4fc

View File

@@ -3,7 +3,6 @@ package pipe
import ( import (
"errors" "errors"
"io" "io"
"runtime"
"sync" "sync"
"time" "time"
@@ -136,11 +135,10 @@ func (p *pipe) writeMultiBufferInternal(mb buf.MultiBuffer) error {
if p.data == nil { if p.data == nil {
p.data = mb p.data = mb
return nil } else {
p.data, _ = buf.MergeMulti(p.data, mb)
} }
return nil
p.data, _ = buf.MergeMulti(p.data, mb)
return errSlowDown
} }
func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error { func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
@@ -155,30 +153,23 @@ func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
return nil return nil
} }
if err == errSlowDown { if err == errBufferFull {
p.readSignal.Signal() if p.option.discardOverflow {
buf.ReleaseMulti(mb)
// Yield current goroutine. Hopefully the reading counterpart can pick up the payload. return nil
runtime.Gosched() }
return nil select {
case <-p.writeSignal.Wait():
continue
case <-p.done.Wait():
buf.ReleaseMulti(mb)
return io.ErrClosedPipe
}
} }
if err == errBufferFull && p.option.discardOverflow { buf.ReleaseMulti(mb)
buf.ReleaseMulti(mb) p.readSignal.Signal()
return nil return err
}
if err != errBufferFull {
buf.ReleaseMulti(mb)
p.readSignal.Signal()
return err
}
select {
case <-p.writeSignal.Wait():
case <-p.done.Wait():
return io.ErrClosedPipe
}
} }
} }