Соглашение при использовании интерфейса Reader внутри оператора select - PullRequest
0 голосов
/ 28 октября 2018

Я обернул очередь для реализации интерфейсов Writer и Reader (соответственно, для отправки и отправки).

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

loop:
    for {
        var data []byte
        select {
            case <-done:
                break loop
            case _, err := queue.Read(data):
                fmt.Println(string(data))
        }
    }

Как правильно это сделать?Read здесь есть блокировка - она ​​ждет, пока в очереди появится сообщение.

Есть ли лучший, более идиоматичный способ добиться этого?

1 Ответ

0 голосов
/ 28 октября 2018

Труднее взять синхронный API (например, queue.Read, как вы описали выше) и сделать его асинхронным, чем сделать наоборот.

Идея состоит в том, чтобы создать новую процедуру (используя,например, пойти func () {...}) и заставить эту программу выполнить чтение и записать вывод в канал.

Тогда первая программа заблокирует этот канал и тот, который уже блокирует.

Это потенциально может на некоторое время оставить потерянные ресурсы, если чтение занимает много времени, но если у вас синхронный API, это лучшее, что вы можете сделать.

...