Как собрать и отсортировать результаты регистрации из многопроцессорных - PullRequest
0 голосов
/ 17 июня 2019

У меня есть инструмент CLI, написанный на Python, который работает с кучей файлов и использует процессы для небольших файловых операций.Хотя части, выполняемые как потоки, являются только подразделами в более длинном файловом потоке, выходные данные журналирования потоковых действий (очевидно) асинхронны.

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

Этот код иллюстрирует мою основную проблему:

logger = logging.getLogger()
logger.handlers = []
logging.basicConfig(format='%(levelname)s %(process)s: %(message)s',
                    level=logging.DEBUG)

def work():
    for i in range(5):
        logging.debug(str(i))
        time.sleep(random())

if __name__ == "__main__":
    processes = []
    for i in range(3):
        p = Process(target=work)
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

Синхронный вывод выглядит примерно так:

DEBUG 64571: 0
DEBUG 64572: 0
DEBUG 64573: 0
DEBUG 64572: 1
DEBUG 64572: 2
DEBUG 64572: 3
DEBUG 64572: 4
DEBUG 64573: 1
DEBUG 64571: 1
DEBUG 64573: 2
DEBUG 64573: 3
DEBUG 64573: 4
DEBUG 64571: 2
DEBUG 64571: 3
DEBUG 64571: 4

Вместо этого вывода я бы хотел, чтобы вывод консоли был остановлен во время выполнения процесса, а затем выводить журналы, отсортированные по процессам.Идентификатор, в идеале выводимый, как только закончится следующий первый процесс.

Я в основном ищу, что делать концептуально и какие модули и методы могут быть полезны для этого.С моим кодом мои основные вопросы:

a) Как мне использовать MemoryHandler для хранения вывода и как мне отформатировать его после завершения процесса?Или это вообще не жизнеспособная идея?б) Как я могу следить за завершением процессов, либо по одному, либо по всем (я полагаю, что позже это просто код после цикла p.join ())?c) За пределами моего изолированного примера, как включить этот «сортированный по процессам» вход в систему до и после раздела, в моем коде, который использует многопоточность.

Спасибо за любые указатели;)

...