Канал Golang SetReadDeadline завершается ошибкой после первого чтения - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь прочитать именованный канал в Linux, используя Go.Обычно функция File.Read блокируется до тех пор, пока в канале нет доступных данных, но можно использовать относительно новую функцию File.SetReadDeadline, чтобы установить «тайм-аут» для чтения.

Я обнаружил,однако этот тайм-аут происходит только при первом чтении.Если я запускаю следующий код, сообщение «Тайм-аут, начало нового чтения» печатается только один раз, а вызов pipe.Read блокируется в следующий раз в цикле.(Это все еще работает, если я отправляю данные в канал, я получаю сообщение «получены».)

func Read(pipe *os.File) error {
  for {
    pipe.SetDeadline(time.Now().Add(5000 * time.Millisecond))
    buff := make([]byte, 1024*64)
    s, err := pipe.Read(buff)
    if err == nil {
      log.Printf("Received bytes of length  %d", s)
    } else if os.IsTimeout(err) {
      log.Println("Timed out, starting new read")
    } else {
      log.Printf("Pipe error %s", err)
      return err
    }
  }
}

В моих исследованиях похоже, что мне может понадобиться сбросить базовый контекст опроса (что бы это ни значило).) Есть ли способ заставить это работать, или это просто ошибка Go?

...