[英]Comparing Python Multiprocessing and Multithreading on 100K Files
我有一个文件夹,里面有 100K 个文件,总共 50GB。 目标是读取每个文件运行一些正则表达式来存储数据。 我正在尝试运行测试以查看哪种方法,多线程或多处理,将是最理想的。
我使用的服务器有 4 个内核和 8GB RAM。 如果没有任何多线程,完成任务大约需要 5 分钟。
from concurrent.futures import ThreadPoolExecutor threads= [] def read_files(filename): with open(filename, 'r') as f: text = f.read() with ThreadPoolExecutor(max_workers=50) as executor: for filename in glob.iglob('/root/my_app/my_app_venv/raw_files/*.txt', recursive=True): threads.append(executor.submit(read_files, filename))
多线程平均为 1 分 30 秒。
现在我正在尝试为 Multiprocessing 设置测试并使用服务器上的 4 个内核而没有任何结果。
from multiprocessing import Lock, Process, Queue, current_process import time import queue def read_files(tasks_to_accomplish): while True: try: filename = tasks_to_accomplish.get_nowait() with open(filename, 'r') as f: text = f.read() except queue.Empty: break def main(): number_of_processes = 4 tasks_to_accomplish = Queue() processes = [] for filename in glob.iglob('/root/my_app/my_app_venv/raw_files/*.txt', recursive=True): tasks_to_accomplish.put(filename) # creating processes for w in range(number_of_processes): p = Process(target=read_files, args=(tasks_to_accomplish,)) processes.append(p) p.start() # completing process for p in processes: p.join() if __name__ == '__main__': main()
请帮忙!
由于您已经在使用concurrent.futures
,我建议使用ProcessPoolExecutor
,它位于multiprocessing
之上,类似于ThreadPoolExecutor
位于threading
之上。 这些类具有几乎相同的 API
https://docs.python.org/3/library/concurrent.futures.html#processpoolexecutor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.