我正在使用多处理功能在庞大的数据集上运行图像处理,我想知道在Pool内部运行ThreadPoolExecutor与仅在所有项目上运行Pool是否有任何好处。
数据集包含多个文件夹,每个文件夹都包含图像,因此我的第一步是将每个文件夹分为一个进程,并将该文件夹中的每个图像拆分为一个线程。另一种方法是只获取每个图像并将其作为进程运行。
例如,每个文件夹作为一个进程,每个图像作为一个线程
from concurrent import futures
from multiprocessing import Pool
from pathlib import Path
def handle_image(image_path: Path):
pass
def handle_folder(folder_path: Path):
with futures.ThreadPoolExecutor() as e:
e.map(handle_image, folder_path.glob("*"))
e.shutdown()
if __name__ == '__main__':
dataset_folder = Path("Folder")
with Pool() as p:
p.imap_unordered(handle_folder, dataset_folder.iterdir())
p.close()
p.join()
将每个图像作为一个过程
from multiprocessing import Pool
from pathlib import Path
def handle_image(image_path: Path):
if not image_path.is_file():
return
if __name__ == '__main__':
dataset_folder = Path("Folder")
with Pool() as p:
p.imap_unordered(handle_image, dataset_folder.glob("**/*"), 100)
p.close()
p.join()
答案 0 :(得分:1)
您的任务(图像处理)听起来受CPU限制,因此线程将没有足够的空闲时间让彼此执行,除非您委派了某个C库来释放大部分处理的GIL。
但是,如果处理时间与I / O时间相当,则每个进程最多可以加快几个线程的速度(请参阅400 threads in 20 processes outperform 400 threads in 4 processes while performing an I/O-bound task,以了解如何比较更多I / O-绑定任务)。
请注意,对于大规模的分布式工作,您可以查看one of the 3rd-party implementations of a distributed task queue for Python而不是内置池和map
。