On Sat, Nov 14, 2020 at 5:43 PM 陶青云 <qingyu...@gmail.com> wrote:
> Don't use channels for this. It's not what they are for. >> >> Ian > > I see some examples using the buffered channel as a job queue. Could you > give me some advise on this. > If you search for terms like "go channel job queue" you'll find examples that at first glance appear relevant to your problem. Such as https://www.opsdash.com/blog/job-queues-in-go.html. But none of them, AFAICT, implement the behavior you want. If you don't need compatibility with Go's `select` statement probably the simplest solution is a ring (circular) buffer. Search for "go ring buffer" for some examples; although, implementing a ring buffer is simple enough it can be used as an interview question. So I leave the details as an exercise for the student. You could use a Go channel if you added an explicit mutex that has to be acquired by both the channel consumer(s) and producer(s) before popping and/or inserting a value into the channel. But that is suboptimal since the channel send/receive ops already use an implicit mutex to make those individual operations concurrent safe. The only purpose of the explicit mutex is to make it possible for the producer(s) in your example to atomically drop an "old" entry before inserting a "new" entry. As Ian said a Go channel is the wrong mechanism for your problem. -- Kurtis Rader Caretaker of the exceptional canines Junior and Hank -- 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/CABx2%3DD-PBF_LCEWy_BGfG-bu1v%2BTNP5m_s_dM9Ld8ducwnY3%3Dg%40mail.gmail.com.