Несколько потоков для обработки файлов в python

Я пытаюсь обработать некоторые файлы с помощью python, однако, поскольку количество файлов огромно, это занимает слишком много времени. Я пытаюсь создать несколько потоков и хочу выполнять эту вещь параллельно, чтобы сократить время. Однако не уверен, как именно это сделать.

Я написал следующий код, который должен выполнять 10 файлов параллельно, но похоже, что вместо создания 10 потоков он создает 100 потоков, по одному для каждого файла.

    def setup_logging():
    log_formatter = logging.Formatter('%(asctime)s [%(threadName)s] [%(levelname)s] %(message)s')
    root_logger = logging.getLogger()

    file_handler = logging.FileHandler("./logs.log")
    file_handler.setFormatter(log_formatter)
    root_logger.addHandler(file_handler)

    console_handler = logging.StreamHandler()
    console_handler.setFormatter(log_formatter)
    root_logger.addHandler(console_handler)
    root_logger.level = logging.DEBUG


def print_file_name(name):
    logging.info(name)


if __name__ == '__main__':
    setup_logging()
    logging.info("hi")

    dir_name = "/home/egnyte/demo/100"
    file_list = os.listdir(dir_name)
    threads = []
    import threading
    for i in range(0, len(file_list), 10):
        for index in range(0, 10, 1):
            t = threading.Thread(target=print_file_name, args=(file_list[i+index],))
            threads.append(t)
            t.start()

        for t in threads:
            t.join()

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

2017-03-30 13:16:46,120 [Thread-9] [INFO] demo_69.txt
2017-03-30 13:16:46,120 [Thread-10] [INFO] demo_45.txt
2017-03-30 13:16:46,121 [Thread-11] [INFO] demo_72.txt
2017-03-30 13:16:46,121 [Thread-12] [INFO] demo_10.txt
...
...
2017-03-30 13:16:46,149 [Thread-98] [INFO] demo_29.txt
2017-03-30 13:16:46,150 [Thread-99] [INFO] demo_27.txt
2017-03-30 13:16:46,150 [Thread-100] [INFO] demo_39.txt

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

pool = multiprocessing.Pool(processes=10) result_list = pool.map(print_file_name, (файл для файла в os.listdir(dir_name)))


person Gaurang Shah    schedule 30.03.2017    source источник


Ответы (1)


Вы создаете поток для каждого файла:

for i in range(0, len(file_list), 10):
    for index in range(0, 10, 1):
        t = threading.Thread(target=print_file_name, args=(file_list[i+index],))
        threads.append(t)
        t.start()

(Примечание: вы должны использовать for file in file_list для просмотра списка файлов)

Будет ли использование пула потоков, как в следующем ответе, лучшим решением:

параллельный анализ файлов, несколько ядер ЦП

person Robben_Ford_Fan_boy    schedule 30.03.2017
comment
Я также пытался использовать многопроцессорный процесс, но кажется, что он создает только один поток для всех файлов. Я также обновил вопрос. - person Gaurang Shah; 31.03.2017