Создайте отдельный регистратор для каждого процесса при использовании concurrent.futures.ProcessPoolExecutor в Python - PullRequest
0 голосов
/ 10 июля 2020

Я очищаю огромный дамп данных CSV. Мне удалось разделить один большой файл на более мелкие, используя gawk, первоначально используя unix SE Query в виде следующего потока:

     BIG CSV file -> use gawk script + bash -> Small CSV files based on columns

У меня около 12 разделенных csv файлы, созданные с использованием вышеупомянутого потока, каждый из которых содержит ~ 170 тыс. строк.

Я использую python3.7.7 на Windows 10 машине.

Код


def convert_raw_data(incoming_line, f_name, line_counter):
     # do some decoding magic
     # catch exception and try to log it into the a logger file under `f_name.log`


def convert_files(dir_name, f_name, dest_dir_name):
    # Open the CSV file
    # Open the Destination CSV file to store decoded data
    line_counter = 1
    for line in csv_reader:
       # convert raw HEX to Floating point values using `convert_raw_data` function call
       line_counter = line_counter + 1
       status = convert_raw_data(csv)
       if status:
          return f'All good for {f_name}.'
       else:
          return f'Failed for {f_name}'

def main():

    # Parse Arguments Logic here

    # get CSV Files and their respective paths
    csv_files = get_data_files_list(args.datasets)

    # decode raw data from each split csv file as an individual process
    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = [ executor.submit(convert_files, dir_name, f_name, dest_dir) for dir_name, f_name in csv_files ]

        for f in concurrent.futures.as_completed(results):
            print(f.result())

Требования

I wi sh, чтобы установить регистратор logging с именем f_name.log в каждом процессе, порожденном ProcessPoolExecutor, и хотите хранить журналы с соответствующим именем проанализированного файла. Я не уверен, следует ли мне использовать что-то вроде:


def convert_raw_data(...., logger):
    logger.exception(raw_data_here)


def convert_files(....):
    logger = logging.basicConfig(filename=f_name, level=logging.EXCEPTION)

или есть ли предостережения для использования модулей ведения журнала в многопроцессорной среде?

1 Ответ

0 голосов
/ 10 июля 2020

Обнаружен простой способ выполнить эту задачу:

import logging

def create_log_handler(fname):
    logger = logging.getLogger(name=fname)
    logger.setLevel(logging.ERROR)

    fileHandler = logging.FileHandler(fname + ".log")
    fileHandler.setLevel(logging.ERROR)

    logger.addHandler(fileHandler)

    formatter = logging.Formatter('%(name)s %(levelname)s: %(message)s')

    fileHandler.setFormatter(formatter)

    return logger

Я вызвал create_log_handler в своей функции convert_files(.....), а затем использовал logger.info и logger.error` соответственно.

передавая logger в качестве параметра convert_raw_data, я смог зарегистрировать даже ошибочные точки данных в каждом из моих CSV-файлов для каждого процесса.

...