如何检查通道是否在工作人员中打开?

时间:2018-01-08 04:12:27

标签: go

以下是我正在做的事情:一些工人为他们排队工作。

我有一个简单的工人:

func worker(jobs <-chan int, wg *sync.WaitGroup) {
    for work := range jobs {
        perform(work)
    }
    wg.Done()
}

启动它们:

    jobs := make(chan int)
    var wg sync.WaitGroup

    for w := 1; w <= parallel; w++ {
        wg.Add(1)
        go worker(jobs, &wg)
    }

我也有一个队列,这里有问题,如何检查是否有可用的工作人员,然后只写?

func queue(jobs chan int, stop chan bool) {
    for {
            select {
            case jobs<-?: // How to check what worker is available?
                work := receiveWork()
                jobs <- work
                continue
            case <-stop:
                return
            }
        }
    }
}

启动队列:

stop := make(chan bool)
go queue(jobs, stop)

请注意,只有在有可用的工作人员时才应调用receiveWork()

1 个答案:

答案 0 :(得分:1)

使用两个频道的一个选项,一个用于准备,一个用于实际工作:

func worker(ready chan struct{}, work chan int, wg *sync.WaitGroup) {
    for range ready {
        w, ok := <-work
        if !ok {
            break
        }
        perform(w)
    }
    wg.Done()
}

func queue(ready chan struct{}, work chan int, stop chan struct{}) {
    defer close(ready)
    defer close(work)
    for {
        select {
        case ready <- struct{}{}:
            work <- receiveWork()
        case <-stop:
            return
        }
    }
}

playground example