在进程内运行线程

时间:2019-06-06 23:11:07

标签: python multithreading multiprocessing

我正在使用多处理功能在庞大的数据集上运行图像处理,我想知道在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()

1 个答案:

答案 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