Я создаю модуль для порождения процессов с использованием многопроцессорной обработки Python.Часть модуля ориентирована на создание рабочих процессов и возврат результатов этих процессов в очередь результатов.Ведение журнала для модуля осуществляется с помощью TCP SocketHandler и StreamHandler.
Проблема в том, что ведение журнала иногда работает, но не всегда.Фактический многопроцессорный модуль работает должным образом, но выходные журналы непоследовательно отображаются в консоли ведения журнала.Иногда отображаются все или большая часть журналов.Тем не менее, журналы могут периодически или в конечном итоге исчезать, пока не отображается только часть журналов.Кроме того, при запуске отдельных модулей журналы, как и ожидалось, отображают все журналы.
Ниже приведен фрагмент кода, представляющий мое текущее тестирование:
#Check process list for dead processes
def clean_process_list(self):
logger.info("Checking for dead or orphaned processes.")
if len(self.processes):
for i in range(0, len(self.processes)):
process = self.processes.pop()
if process.is_alive() is not True:
logger.info("{} is unresponsive; terminating process.".format(process.name))
process.terminate()
else:
self.processes.appendleft(process)
#Worker method which puts results from a target method into a queue, if any exist. Self-terminates on completion.
def worker(self, args):
worker_name = multiprocessing.current_process().name
logging_socket = tcp_log_socket.local_logging_socket('test.json', worker_name) #reinitializing logger in worker for troubleshooting
logger = logging_socket.logger
logger.info("Running process {}; waiting for results.".format(worker_name))
results = self.target_method(*args)
results_queue = self.process_results
logger.info("Ran target method, storing results and name of finished process.")
results_queue.put([results, worker_name])
logger.info("Process {} completed, exiting.".format(worker_name))
sys.exit(0)
#Creates and uses a process to run a job using the assigned target method.
def use_process(self, args):
self.clean_process_list()
self.process_results = multiprocessing.Queue()
process = multiprocessing.Process(target=self.worker, args=(args,))
logger.info("Created process; process name is {}".format(process.name))
self.processes.append(process)
process.start()
logger.info("Process {} started.".format(process.name))
Ожидаемый вывод журнала по сравнению с неожиданным выводом приведен ниже:
Идеальный результат:
Проверка на мертвые или потерянные процессы.
Процесс-1 не отвечает;завершение процесса.
Создан процесс;Имя процесса: Процесс-2
Процесс-2 запущен.
Запуск процесса Process-2;жду результатов.
Выполнен целевой метод, сохраняются результаты и имя завершенного процесса.
Сумма: 5
Процесс Процесс-2 завершен, выход.
Неожиданный вывод
Проверка на мертвые или потерянные процессы.
Создан процесс;имя процесса Process-2
Запуск процесса Process-2;жду результатов.
Сумма: 5
Или еще хуже:
Сумма: 5
С учетом вышесказанного, я уже выполнил базовую настройку на моем регистраторе (то есть: установил уровень журнала), и мой сервер регистрации настроен на получение полных записей, если было получено неполное (более короткое) сообщение.
Кто-нибудьзнаете какие-либо симптомы или первопричину этой проблемы?
РЕДАКТИРОВАТЬ: я должен упомянуть, что код журнала почти совпадает с кодом, описанным в кулинарной книге регистрации Python для нескольких процессов: https://docs.python.org/3/howto/logging-cookbook.html