На самом деле ваш вопрос состоит из двух частей: как поместить в очередь данные в 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. Я выбрал синхронизацию процедур, создав еще пару каналов, которые передают фиктивные значения, чтобы гарантировать, что очистка завершена должным образом. Эти каналы специально не буферизуются, поэтому отправка происходит в режиме блокировки.