多个线程来处理python中的文件

时间:2017-03-30 11:27:50

标签: python python-2.7 python-multithreading

我正在尝试使用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)中文件的文件))

1 个答案:

答案 0 :(得分:0)

您正在为每个文件创建一个帖子:

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循环浏览文件列表)

使用如下面的答案中的线程池是一个更好的解决方案:

parallel file parsing, multiple CPU cores