Что вызывает эти противоречивые журналы с использованием многопроцессорной обработки Python? - PullRequest
0 голосов
/ 27 сентября 2018

Я создаю модуль для порождения процессов с использованием многопроцессорной обработки 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

...