我目前正在开发一个图像处理项目,我有大约50k图像,我想做几个简单的预处理(更改大小,更改图像类型等)并将结果保存到单独的本地目录
我已经使用Python完成了预处理代码,并且没问题。但这花了太长时间我决定使用multiprocessing
模块。但是我在运行代码时遇到了一个奇怪的行为。
请参阅下文
def doPreprocess(f):
#do the preprocessing steps and save to directory
if __name__ == '__main__':
path = "C:/My/Image/Folder/"
files = fnmatch.filter(os.listdir(path), pat = '*.jpg')
print (len(files))
pool = mp.Pool(processes=4)
pool.map_async(doPreprocess, files)
print ("temp")
但是,当我使用命令提示符运行代码时,它会跳过预处理步骤并立即打印temp,就好像该函数根本没有运行一样。预处理的图像也不会保存。
有人可以帮助我吗?
提前谢谢。
注意:我使用的是Windows 10和Python 3.6
答案 0 :(得分:0)
我测试了你的代码,问题是你的主线程在完成其他线程之前结束了...如果你尝试这个简化版本的代码,你会看到我的意思:
import multiprocessing as mp
def doPreprocess(f):
print(f)
if __name__ == '__main__':
files = ["hello"] * 10
pool = mp.Pool(processes=4)
res = pool.map_async(doPreprocess, files)
print ("temp")
这基本上打印了temp和exit ...但是如果你添加:
res.wait()
在print("temp")
主线程将等待所有其他线程完成之前,然后打印temp并退出。如果你改变了它也会起作用:
res = pool.map_async(doPreprocess, files)
为:
res = pool.map(doPreprocess, files)
为什么呢?一个是非阻塞的(map_async),理想情况下你在主线程中做其他事情,其他阻塞(map),这或多或少相当于在wait()
之后立即放置pool.map_async
。