Я пытаюсь обработать некоторые файлы с помощью 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)))