Python 3.x — запись в один файл с многопроцессорной обработкой ⇐ Python
Python 3.x — запись в один файл с многопроцессорной обработкой
У меня есть класс Logger, который наследует Thread, и есть класс TestProcess, который наследует Process. Я пытаюсь использовать этот класс Logger в основном процессе, а также в TestProcess, однако регистрируются только журналы основного процесса. Эта проблема возникает, только если я пытаюсь использовать версию 3.x. Журналирование работает нормально с версией 2.7
Есть идеи, в чем может быть проблема? Публикация файлов для справки
Кроме того, я использую MacOS
########################## # Файл 1: main.py ########################## импортировать систему время импорта импортировать обратную трассировку из журнала импорта регистратора, Logger из процессов импорта процессов из test_process импортировать TestProcess защита print_some_text (менеджер): а не менеджер.exit.is_set(): log('Внутри print_some_text') время.сон(20) менеджер.wait_for_child_processes_to_exit() защита основной(): пытаться: logger_thread = Logger("final.log", "test_logs") logger_thread.start() log("main(): начало") Process_manager = Процессы (logger_thread) test_process_1 = TestProcess('процесс') process_manager.add_process(test_process_1) test_process_1.start() print_some_text(processes_manager) кроме исключения как e: журнал (traceback.format_exc()) sys.exit(1) если __name__ == '__main__': основной() ########################## # Файл 2:processes.py ########################## импортировать сигнал из журнала импорта регистратора, stop_logging из события многопроцессорного импорта Классовые процессы: def __init__(сам, регистратор): self.processes = [] self.exit = Событие() self.logger = регистратор signal.signal(signal.SIGINT, self.exit_graceful) сигнал.сигнал(сигнал.SIGTERM, self.exit_изящно) защита add_process(self, proc): self.processes.append(процедура) def exit_graceically (self, Signum, Frame): log(f"Завершение процессов. Signum: {signum}") для p в self.processes: п.терминировать() self.exit.set() защита wait_for_child_processes_to_exit (self): для p в self.processes: p.join() stop_logging() self.logger_thread.join() ########################## # Файл 3: test_process.py ########################## из многопроцессорного импорта Процесс, Событие время импорта импортировать обратную трассировку из журнала импорта регистратора класс TestProcess(Процесс): def __init__(я, имя): Process.__init__(сам) self._name = имя self.exit = Событие() защита запуска (сам): пытаться: а не self.exit.is_set(): log("Внутри test_process") время.сон(10) кроме исключения как e: журнал (traceback.format_exc()) защита завершения (сам): log("завершить test_process") self.exit.set() ########################## # Файл 4: logger.py ########################## журнал импорта из даты и времени импорта даты и времени из logging.handlers импортировать TimedRotatingFileHandler из очереди импорта многопроцессорной обработки из ОС импортировать getpid из потока импорта потока LOG_QUEUE = Очередь() класс Logger(Thread): def __init__(я, файл журнала, имя): Thread.__init__(сам) self._logger = logging.getLogger(имя) self._logger.setLevel(logging.INFO) обработчик = TimedRotatingFileHandler (файл журнала, когда = "полночь", интервал = 1, резервное копирование = 0) self._logger.addHandler(обработчик) self._syslog_open = Ложь защита запуска (сам): пока правда: запись = LOG_QUEUE.get() если запись Нет: перерыв self._log(запись) def _log(self, msg, level="INFO"): self._logger.log(20, сообщение) def log(msg, level="INFO"): если сообщение Нет: возвращаться LOG_QUEUE.put(запись) защита stop_logging(): LOG_QUEUE.put(нет)
У меня есть класс Logger, который наследует Thread, и есть класс TestProcess, который наследует Process. Я пытаюсь использовать этот класс Logger в основном процессе, а также в TestProcess, однако регистрируются только журналы основного процесса. Эта проблема возникает, только если я пытаюсь использовать версию 3.x. Журналирование работает нормально с версией 2.7
Есть идеи, в чем может быть проблема? Публикация файлов для справки
Кроме того, я использую MacOS
########################## # Файл 1: main.py ########################## импортировать систему время импорта импортировать обратную трассировку из журнала импорта регистратора, Logger из процессов импорта процессов из test_process импортировать TestProcess защита print_some_text (менеджер): а не менеджер.exit.is_set(): log('Внутри print_some_text') время.сон(20) менеджер.wait_for_child_processes_to_exit() защита основной(): пытаться: logger_thread = Logger("final.log", "test_logs") logger_thread.start() log("main(): начало") Process_manager = Процессы (logger_thread) test_process_1 = TestProcess('процесс') process_manager.add_process(test_process_1) test_process_1.start() print_some_text(processes_manager) кроме исключения как e: журнал (traceback.format_exc()) sys.exit(1) если __name__ == '__main__': основной() ########################## # Файл 2:processes.py ########################## импортировать сигнал из журнала импорта регистратора, stop_logging из события многопроцессорного импорта Классовые процессы: def __init__(сам, регистратор): self.processes = [] self.exit = Событие() self.logger = регистратор signal.signal(signal.SIGINT, self.exit_graceful) сигнал.сигнал(сигнал.SIGTERM, self.exit_изящно) защита add_process(self, proc): self.processes.append(процедура) def exit_graceically (self, Signum, Frame): log(f"Завершение процессов. Signum: {signum}") для p в self.processes: п.терминировать() self.exit.set() защита wait_for_child_processes_to_exit (self): для p в self.processes: p.join() stop_logging() self.logger_thread.join() ########################## # Файл 3: test_process.py ########################## из многопроцессорного импорта Процесс, Событие время импорта импортировать обратную трассировку из журнала импорта регистратора класс TestProcess(Процесс): def __init__(я, имя): Process.__init__(сам) self._name = имя self.exit = Событие() защита запуска (сам): пытаться: а не self.exit.is_set(): log("Внутри test_process") время.сон(10) кроме исключения как e: журнал (traceback.format_exc()) защита завершения (сам): log("завершить test_process") self.exit.set() ########################## # Файл 4: logger.py ########################## журнал импорта из даты и времени импорта даты и времени из logging.handlers импортировать TimedRotatingFileHandler из очереди импорта многопроцессорной обработки из ОС импортировать getpid из потока импорта потока LOG_QUEUE = Очередь() класс Logger(Thread): def __init__(я, файл журнала, имя): Thread.__init__(сам) self._logger = logging.getLogger(имя) self._logger.setLevel(logging.INFO) обработчик = TimedRotatingFileHandler (файл журнала, когда = "полночь", интервал = 1, резервное копирование = 0) self._logger.addHandler(обработчик) self._syslog_open = Ложь защита запуска (сам): пока правда: запись = LOG_QUEUE.get() если запись Нет: перерыв self._log(запись) def _log(self, msg, level="INFO"): self._logger.log(20, сообщение) def log(msg, level="INFO"): если сообщение Нет: возвращаться LOG_QUEUE.put(запись) защита stop_logging(): LOG_QUEUE.put(нет)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Правильно разорвать процесс при использовании pytest с многопроцессорной обработкой.
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-