我正在尝试使用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)中文件的文件))
答案 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
循环浏览文件列表)
使用如下面的答案中的线程池是一个更好的解决方案: