问题遇到的现象和发生背景
使用python多进程处理一个数据集,处理函数是 对每张图片进行加噪并保存
问题相关代码,请勿粘贴截图
img_paths = get_file_path(path1, path2)
print("all:", len(img_paths))
# 1.pool.map
avi_cpu = os.cpu_count()-30
print('there is {} cpu'.format(avi_cpu))
pool = Pool(avi_cpu) # 当前可用cpu数量
# pool.map_async(process_image, img_paths)
res = []
for img in img_paths:
r = [pool.apply_async(process_image, (img,))]
res.append(r)
#2.该情况处理时处理图片的子进程会直接跳过
# pool = Pool(100)
# cpus = os.cpu_count()
# print('there is {} cpu'.format(cpus))
# 任务切分
# splits = list(divide(cpus, img_paths))
# for split in splits:
# pool.apply_async(process_image, args=(split,))
pool.close()
pool.join()
end = time.time()
print("deal data cost:", end - start)
运行结果及报错内容
正常情况下一个进程处理一张图片在几百秒以内,但使用上述1代码时在处理快结束的时候,最后几个处理进程会变得很慢,单个进程的用时会达到几千甚至上万秒。搞笑的是,我之前用同样的代码处理另一个数据集的时候完全正常,两个数据集的图片数不同,图片大小也存在差异
我的解答思路和尝试过的方法
pool.map
pool.map_async
pool.apply_async
还有chunksize的设置,我试过设为 文件总数/cpu数,开始效果就变的更慢一些
在使用2代码时,只会有主进程运行,跳过处理函数
我想要达到的结果
正常处理数据集,不会在最后几个进程停顿住