Круглые go каналы - PullRequest
       3

Круглые go каналы

0 голосов
/ 10 февраля 2020

У меня есть два 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...