Стоп горутин, который грациозно заблокирован - PullRequest
0 голосов
/ 09 июня 2018

У меня есть программа, которая постоянно блокируется при чтении стандартного ввода, например:

func routine() {
    for {
        data := make([]byte, 8)
        os.Stdin.Read(data);
        otherChannel <-data
    }
}

Подпрограмма ожидает чтения 8 байтов через стандартный ввод и передает другой канал.

Я хочуизящно прекратить эту программу из основного потока.Однако, поскольку программа почти всегда блокируется чтением со стандартного ввода, я не могу найти хорошее решение, чтобы заставить его остановиться.Я думал о чем-то вроде:

func routine(stopChannel chan struct{}) {
    for {
        select {
        case <-stopChannel:
            return
        default:
            data := make([]byte, 8)
            os.Stdin.Read(data);
            otherChannel <-data
        }
    }
}

Однако проблема в том, что если в stdin больше нет ввода, когда stopChannel закрыто, программа будет заблокирована и не вернется.

Есть ли хороший подход, чтобы он сразу возвращался, когда хочет основной поток?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...