There is this: https://godoc.org/bitbucket.org/ausocean/utils/ring
It has been used in production fairly extensively. On Thu, 2019-11-21 at 19:47 -0800, Marcin Romaszewicz wrote: > Hi All, > > Before I reinvent the wheel, and because this wheel is particularly > tricky > to get right, I was wondering if anyone was aware of a a library > providing > something like this > > - conforms to io.Reader > - conforms to io.Writer > - Contains a buffer of fixed size, say, 64MB. If you try to write > when the > buffer is too full, write blocks. When you try to read from an empty > one, > read blocks. > > This describes the behavior of make(chan byte, 64 * MB), however, it > doesn't seem to be efficient to do this with a channel. Say I'm > transferring a few hundred GB via this mechanism. A chan of byte > would need > a few hundred billion byte writes, and a few hundred billion reads. > Doesn't > sound like it could be efficient at all. You can't implement this > with a > channel of []byte, because you'd violate your buffering limit if you > pass > too large of a byte array, so you'd have to chop things up into > blocks, but > maybe that's simpler than a full fledged blocking ring buffer. > > Anyhow, I've implemented such things in various OS level plumbing, so > I > know I can do it in Go much more easily, just hoping to avoid it :) > > Thanks for any advice, > -- Marcin > -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/152a954eaa3eea02514e71bb142904480241ad6c.camel%40kortschak.io.