Более идиоматический способ добавления результата канала в очередь по завершении - PullRequest
2 голосов
/ 28 июня 2010

Итак, сейчас я просто передаю указатель на объект Queue (реализация не имеет большого значения) и вызываю queue.add(result) в конце программы, которая должна добавить вещи в очередь.нужна такая же функциональность - и, конечно, выполнение проверки цикла с использованием синтаксиса с запятой ok недопустимо с точки зрения производительности по сравнению с простым вызовом функции добавления очереди.нет?

1 Ответ

1 голос
/ 01 июля 2010

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

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

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 во второй строке, что сделает операции отправки асинхронными, пока буфер канала не будет заполнен.

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

...