Получение данных о состоянии гонки с нулем - PullRequest
1 голос
/ 19 октября 2019

Я использую нольолог с диодами, чтобы предотвратить состояние гонки при записи в стандартный вывод. Это моя настройка журнала:

consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: *logNoColor, TimeFormat: *logDateTimeFormat}
return diode.NewWriter(consoleWriter, 1000, 10*time.Millisecond, onMissedMessages)

Я следую приведенному ниже примеру: Документация Zerolog

Наконец, я установил глобальный регистратор с записывающим устройством, возвращенным сверху(f):

log.Logger = zerolog.New(f).With().Timestamp().Logger()

У меня есть ловушка отключения (прослушивает CTRL + C), которая в основном просто записывает сообщение журнала при его вызове и отменяет корневой контекст. Я также пишу сообщение в журнале по истечении 1 секунды, используя функцию time.After.

Когда я не нажимаю CTRL + C, приложение работает должным образом;однако, когда я нажимаю CTRL + C до 1-секундного отложенного выполнения метода, я получаю условие гонки данных. Когда я удаляю операторы журнала, проблема исчезает, заставляя меня поверить, что установка диода сверху не помогает предотвратить состояние гонки.

Просто чтобы убедиться, что я понимаю, как работает golang:

  1. Отмена контекста высвобождает ресурсы, связанные с этим контекстом. То есть. если у вас есть дочерний контекст с каналом и вы закрываете дочерний контекст, только этот канал будет закрыт / освобожден
  2. os.Stdout, os.Stderr и т. д. не являются поточно-ориентированными, и операции над ними должны бытьконтролируется разработчиком.
  3. Я могу проверить, выполнен ли контекст Done () из многочисленных программ без проблем с синхронизацией. Тем не менее, я могу и должен читать только канал из одного потока
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...