On Thursday, March 15, 2018 at 3:37:51 AM UTC+8, Ian Lance Taylor wrote:
>
>
> Even for TCP, that's an interesting point.  I wonder if we should have 
> a way to specify a number of bytes to read such that we only allocate 
> the []byte when there is something to read. 
>

I was thinking a better approach is to split I/O readiness and actual I/O 
operations. Currently we combine the two in one step, e.g. 

    r.Read(buf) // blocks until r is readable, and then copy into buf

What if we could instead do

    for ok := runtime.WaitRead(r, timeout); ok {
        buf := bufPool.Get().([]byte) // get a buffer from a sync.Pool 
        r.Read(buf) // should not block here because r is readable
        process(buf) // perform application-specific actions on the read 
data
        bufPool.Put(buf) // return the buffer to sync.Pool so it could be 
reused by other goroutines blocked in similar manner
    }

The additional runtime.WaitRead function should be a rather simple change 
to expose the internal poller signal. In this model, the buffer is only 
needed when the read-ready signal comes.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to