Python多处理不适用于Windows 10

时间:2018-01-16 04:30:30

标签: python opencv image-processing multiprocessing

我目前正在开发一个图像处理项目,我有大约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

enter image description here

1 个答案:

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