У меня есть два go канала (ch1
и ch2
, ch1
используется как очередь, я посылаю ей строку, и новая подпрограмма go будет обрабатывать ее; многие подпрограммы go может обрабатывать строки из этой очереди. Каждая из этих подпрограмм отправит выходные данные во второй канал (ch2
), который будет обработан другой подпрограммой, которая может отправить новую строку в первый канал (ch1
). Если не более строки ставятся в очередь в ch1
и ch2
также пусто Я хочу завершить sh программу.
Проблема в том, что я очищаю группу ожидания до того, как новое сообщение будет поставлено в очередь. Как можно Я делаю эту круговую связь между двумя каналами?
ch1 -> ch2
<-
Это нерабочий код:
wg := &sync.WaitGroup{}
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
for each := range ch1 {
wg.Add(1)
go func() {
defer wg.Done()
time.Sleep(100 * time.Microsecond)
// the other routine in the line marked as #a will
// add a message to ch1 but by then the waitgroup will be empty and wg.Wait() will stop blocking
ch2 <- each + "_processed"
}()
}
}()
go func() {
count := 0
for i := range ch2 {
if count < 2 {
// #a
ch1 <- i
}
count++
}
}()
// start the loop
ch1 <- "A"
wg.Wait()