Более идиоматический способ добавления результата канала в очередь на завершение

StackOverflow https://stackoverflow.com/questions/3129940

  •  01-10-2019
  •  | 
  •  

Вопрос

Итак, прямо сейчас я просто передаю указатель на объект очереди (реализация не имеет значения) и позвонить queue.add(result) В конце Goroutines следует добавлять вещи в очередь.

Мне нужен такой же функциональность - и, конечно, выполнение завершению проверки цикла с синтаксисом запятой ОК недопустимо с точки зрения производительности по сравнению с простой очередью.

Есть ли способ сделать это лучше, или нет?

Это было полезно?

Решение

На самом деле есть две части к вашему вопросу: как входит одна очередь данных, и как можно использовать канал без блокировки.

Для первой части звучит так же, как вам нужно сделать, это вместо того, чтобы использовать канал, чтобы добавить вещи в очередь, используйте канал в качестве очереди. Например:

var (
    ch = make(chan int) // You can add an int parameter to this make call to create a buffered channel

    // Do not buffer these channels!
    gFinished = make(chan bool)
    processFinished = make(chan bool)
)
func f() {
    go g()
    for {
        // send values over ch here...
    }
    <-gFinished
    close(ch)
}
func g() {
    // create more expensive objects...
    gFinished <- true
}
func processObjects() {
    for val := range ch {
        // Process each val here
    }
    processFinished <- true
}
func main() {
    go processObjects()
    f()
    <-processFinished
}

Что касается того, как вы можете сделать этот более асинхронный, вы можете (как указал CThom06), пропустите второе целое число make Вызов во второй строке, которая сделает отправку операций асинхронной до тех пор, пока буфер канала не будет заполнен.

РЕДАКТИРОВАТЬ: Однако (как CTTHOM06 также указал), потому что у вас есть два Goroutines, написав на канал, один из них должен быть ответственным за закрытие канала. Кроме того, моя предыдущая редакция выйдет до завершения ProcessObjects. То, как я решил синхронизировать Goroutines, создает пару большего количества каналов, которые проходят вокруг фиктивных значений, чтобы убедиться, что очистка готовится правильно. Эти каналы специально не раскрываются, так что отправки происходят на шаге блокировки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top