Here is an example that came up in the list that might help you:
https://play.golang.org/p/I8MS0DFgZ2

That being said, It looks like you are over engineering. If I really
understand what you want to accomplish, wouldn't this help?

https://github.com/brunoga/workerpool

You can call Stop()/Start() to stop and resume the workers.


On Fri, May 4, 2018 at 7:24 AM <bambys...@gmail.com> wrote:

> Hi,
>
> I have a scenario which I haven't found a way to implement with the Go
> channels and select statement while it's no problem to do it with the
> select()/poll() functions. The scenario is as follows.
>
> Let me use a Go-like pseudo-code to demonstrate the idea. There is a
> source of a work items which are processed by several goroutines. Here is
> the source procedure:
>
> work_ch := make(chan *WorkItem)
>
> for {
>     work_ch <- NewWorkItem()
> }
>
> And here is the worker thread:
>
> for {
>     wi := <-work_ch
>     self.do_the_work(wi)
> }
>
> Now I need to suspend the work. I stop supplying the work items and want
> to make sure the worker goroutines are done with the work. The source
> procedure becomes something like this:
>
> for {
>     if suspend_requested {
>         for _, worker := range workers {
>             worker.idle_request <- true
>         }
>         for _, worker := range workers {
>             <-worker.idle_response
>         }
>         report_suspend_is_success()
>         wait_until_unsuspended()
>     }
>     work_ch <- NewWorkItem()
> }
>
> And I want to modify the worker thread like this:
>
> for {
>     select {
>     case wi := <- work_ch:
>         self.do_the_work(wi)
>     case <-self.idle_request:
>         self.idle_response <- true
>     }
> }
>
> However this last snippet of code does not work because the cases within
> the select statement are randomly chosen when both channels are ready so I
> have no guarantee that the first case is executed first.
>
> Talking about the select() or poll() functions from the C library which
> evidently were an inspiration for the Go select statement, there is no
> problem with the described approach. It's because the select() function
> returns a complete information about the state of all the monitored
> descriptors and allows the programmer to decide what he wants to read or
> write and in which order, based on readiness of every descriptor.
>
> I think it would be a great idea to have some function similar to
> select()/poll() but working with the Go channels.
>
> --
> 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.
>

-- 
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