Почему мое консольное приложение буферизует сообщения журнала и сокета? - PullRequest
0 голосов
/ 07 октября 2019

Справочная информация:

У меня есть приложение Python (консоль), которое включает сервер сокетов. Это приложение получает сообщения от стороннего клиента (запуск и остановка сообщений от определенного процесса A) для управления задачей записи данных (например, запуск и остановка записи). Вы можете думать об этом как о получении сообщений через сокеты, чтобы начать и остановить запись данных из того же процесса А в течение примерно 5 минут. Сторонний клиент отправляет сообщения в течение почти 2 часов, а затем останавливается, и в конце приложение Python будет создавать группу файлов за сеанс.

Это приложение работает круглосуточно (без присмотра в Windows10 Настольный компьютер), и также есть консоль регистрации, но я заметил, что иногда (не определили шаблон) после запуска в течение 4 или 5 дней я получаю удаленный доступ к системе, используя TeamViewer, и окно консолипоказывая, что последнее сообщение было 1-2 дня назад. Но как только я нажимаю на консоль или нажимаю клавишу в этой консоли, я получаю полный пакет сообщений от сеансов, пропущенных в течение этих последних дней, таким образом, сообщения о запуске и остановке принимаются «одновременно», что приводит к мусорным файлам данных.

Код:

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

            with conn:
                #display client information
                logger.info('Connected with ' + addr[0] + ':' + str(addr[1]))

                while self.enable:
                    #now keep talking with the client
                    data = conn.recv(1024)

                    if data:
                        self.data_cb(data)
                    else:                            
                        logger.debug("no data, closing connection." )
                        break

Вопрос:

Чтоведет к такому поведению буферизации? Может ли это быть ...

  • сторонним клиентом?
  • моего Python-приложения?
  • Что-то в сети Windows?

Кто-нибудь испытывал что-то подобное?

Любая идея действительно ценится, поскольку я понятия не имею, почему это происходит? Спасибо.


Редактировать - Дополнительная информация:

  • Приложение работает на реальной настольной машине (без виртуальной машины)
  • Приложение может работать непрерывно в течение почти месяца (просто остановлено по уважительным внешним причинам, отключению питания, обновлению версии и т. Д.)
  • В последний раз, когда я обращался через Teamviewer и заметил, чтоприложение не получало сообщений в течение дня (приложение работало в течение 4 дней в то время), НО я предположил, что это было по другой причине и планировал пойти на сайт и проверить (потому что что-то подобное случалось раньше). Я получил доступ на следующий день, и это было то же самое. Но на третий день я нажимаю на консоль и пытаюсь просмотреть сообщения, и сразу в журнале появляется целая партия сообщений за предыдущие 2 дня.
  • Приложение работает в течение 2 недель и работаетне получать доступ к ПК через TeamViewer в течение последних 4 дней, если доступ к нему может предотвратить возникновение проблемы.

1 Ответ

0 голосов
/ 17 октября 2019

TL; DR

Функция выбора окна Command Prompt не позволяет приложению каким-либо образом печатать сообщения регистрации и / или считывать данные из сокета (оба находятся в одном потоке).


Ну, я нашел причину этого поведения буферизации, но я не уверен, что это известная вещь или нет (Это было не для меня, поэтому позже я опубликую конкретный вопрос об этомфункция выбора).

Когда я сегодня проверил систему, я обнаружил, что сообщения консоли были заморожены за 3 дня до этого, поэтому Я нажал в окне консоли , и нажал клавишу и все сообщения за 3 дня показывались сразу. Затем я заподозрил функцию выбора вывода на консоль.

Я запустил приложение как обычно и выполнил следующие действия:

  • Я выбрал часть содержимого в консоли приложения.
  • Используя другую консоль, я подключился с фиктивного клиента с помощью ncat (на данный момент ожидаемое сообщение client connected не отображалось)
  • Я отправил фиктивные сообщения (не сделал)либо не появляется)
  • Я закончил ncat соединение (CTRL-C)
  • Нажмите на консоль приложения и нажмите любую клавишу

Вуаля! Все сообщения журнала (относительно соединения и данных появились) и все сообщения, которые я отправил с помощью ncat, были получены как одно большое сообщение.


РЕДАКТИРОВАТЬ : ненужно создать вопрос, это известная «фича». Есть хорошие вопросы здесь , здесь и здесь . Последний показывает, как отключить эту «функцию».

...