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) p.data, _ = buf.MergeMulti(p.data, mb)
return errSlowDown }
return nil
} }
func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error { func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error {
@@ -155,31 +153,24 @@ 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 {
// Yield current goroutine. Hopefully the reading counterpart can pick up the payload.
runtime.Gosched()
return nil
}
if err == errBufferFull && p.option.discardOverflow {
buf.ReleaseMulti(mb) buf.ReleaseMulti(mb)
return nil return nil
} }
select {
case <-p.writeSignal.Wait():
continue
case <-p.done.Wait():
buf.ReleaseMulti(mb)
return io.ErrClosedPipe
}
}
if err != errBufferFull {
buf.ReleaseMulti(mb) buf.ReleaseMulti(mb)
p.readSignal.Signal() p.readSignal.Signal()
return err return err
} }
select {
case <-p.writeSignal.Wait():
case <-p.done.Wait():
return io.ErrClosedPipe
}
}
} }
func (p *pipe) Close() error { func (p *pipe) Close() error {