Python中的多进程,每个进程处理文件的部分

1 投票
1 回答
1664 浏览
提问于 2025-04-30 10:45

我有一个文件想用Python来处理。这个文件里的每一行都是一张图片的路径,我想对每张图片调用一个特征提取的算法。

我想把这个文件分成几个小块,然后每一块都在不同的进程中同时处理。请问在Python中,有哪些好的库或者解决方案可以实现这种多进程处理呢?

暂无标签

1 个回答

4

你的描述表明,使用一个简单的线程池(或进程池)应该可以解决问题:

#!/usr/bin/env python
from multiprocessing.dummy import Pool # thread pool
from tqdm import tqdm # $ pip install tqdm # simple progress report

def mp_process_image(filename):
    try:
       return filename, process_image(filename), None
    except Exception as e:
       return filename, None, str(e)

def main():
    # consider every non-blank line in the input file to be an image path
    image_paths = (line.strip()
                   for line in open('image_paths.txt') if line.strip())
    pool = Pool() # number of threads equal to number of CPUs
    it = pool.imap_unordered(mp_process_image, image_paths, chunksize=100)
    for filename, result, error in tqdm(it):
        if error is not None:
           print(filename, error)

if __name__=="__main__":
    main() 

我假设 process_image() 是一个需要大量计算的任务,并且它会释放全局解释器锁(GIL),也就是说,它的主要工作是在像 OpenCV 这样的 C 扩展中完成的。如果 process_image() 没有释放 GIL,那就把 Pool 导入中的 .dummy 去掉,这样就可以使用进程而不是线程了。

撰写回答