Python、图像压缩和多处理

Python、图像压缩和多处理,python,imagemagick,multiprocessing,Python,Imagemagick,Multiprocessing,我正试图用Python来解决多处理问题,但我就是做不到。请注意,我过去是,现在是,可能永远都是一个编程高手。啊,不管怎样。来了 我正在编写一个Python脚本,它使用用户提供的预定义变量压缩下载到带有ImageMagick的文件夹中的图像,这些变量存储在ini文件中。脚本在下载目录中搜索与模式匹配的文件夹,检查它们是否包含JPG、PNG或其他图像文件,如果包含,则重新压缩并重命名它们,并将结果存储在“压缩”文件夹中 现在,事情是这样的:如果我能够“并行化”整个压缩,我会很高兴,但是。。。我不明白

我正试图用Python来解决多处理问题,但我就是做不到。请注意,我过去是,现在是,可能永远都是一个编程高手。啊,不管怎样。来了

我正在编写一个Python脚本,它使用用户提供的预定义变量压缩下载到带有ImageMagick的文件夹中的图像,这些变量存储在ini文件中。脚本在下载目录中搜索与模式匹配的文件夹,检查它们是否包含JPG、PNG或其他图像文件,如果包含,则重新压缩并重命名它们,并将结果存储在“压缩”文件夹中

现在,事情是这样的:如果我能够“并行化”整个压缩,我会很高兴,但是。。。我不明白我该怎么做

我不想让你对现有的代码感到厌倦,因为它太糟糕了。这只是一个简单的“for file in directory”循环。这就是我想并行化的地方——有人能给我举个例子,说明如何对目录中的文件使用多处理吗

我的意思是,让我们看一段简单的代码:

对于匹配_目录中的f: 打印('我要处理文件:',f)

对于那些需要偷看代码的人,我猜整个并行化部分都会坚持:

for f in ImageFolders:
    print (splitter)
    print (f)
    print (splitter)
    PureName = CleanName(f)
    print (PureName)
    for root, dirs, files in os.walk(f):
        padding = int(round( math.log( len(files), 10))) + 1
        padding = max(minpadding, padding)
        filecounter = 0
        for filename in files:
            if filename.endswith(('.jpg', '.jpeg', '.gif', '.png')):
                filecounter += 1
                imagefile, ext = os.path.splitext(filename)
                newfilename = "%s_%s%s" % (PureName, (str(filecounter).rjust(padding,'0')), '.jpg')
                startfilename = os.path.join (f, filename)
                finalfilename = os.path.join(Dir_Images_To_Publish, PureName, newfilename)
                print (filecounter, ':', startfilename, ' >>> ', finalfilename)
                Original_Image_FileList.append(startfilename)
                Processed_Image_FileList.append(finalfilename)
…在这里,我希望能够添加一段代码,其中一个工作者从原始_Image_文件列表中获取第一个文件,并将其压缩到已处理的_Image_文件列表中的第一个文件名,第二个工作者从后面获取一个文件名,等等,直到特定数量的工作者-取决于ini文件中的用户设置


有什么想法吗?

您可以使用
pool
类创建一个工作人员池,您可以将图像压缩分发给该工作人员池。请参阅
多处理
文档的一节

例如,如果您的压缩函数名为
compress(filename)
,则您可以使用
Pool.map
方法将此函数应用于返回文件名的iterable,即您的列表
匹配\u目录

来自多处理导入池的

def压缩_图像(图像):
“”“定义要如何压缩`image`…””
通过
def分布式压缩(图像,池大小=4):
将池(进程=池大小)作为池:
pool.map(压缩图像,图像)

有多种类似于map的方法可用,请参见。您可能想尝试一下池大小,看看什么最有效。

注意,您可能想阅读样式指南以提高代码的可读性,例如。这听起来可能很有趣,但即使是关于“如何设置我编写的样式”的简单说明对我来说也太高级了。是的,有些事情是显而易见的,我明白了,但有些事情我无法理解,因为我不太熟悉Python的编码和理解所有术语——我也是希腊人,所以语言有时是一个障碍,当我不知道“一个未知的词”是作者的指令的一部分还是编程语言本身时。不过,我必须承认,最大的问题是,我不是从零开始学习,而是跳进一个项目并从那里开始扩展。最后,我理解了整个概念。问题是,正如我在上面对Patrick的评论中提到的,我是一个彻头彻尾的笨蛋,从“创建自己的项目”开始学习。我发现这样对我来说更容易理解一个概念是如何运作的,但这也像是把一张布满洞的薄纸铺成一个“项目”,然后试着一个接一个地修补它们,边走边学习。我提到这一点是因为虽然“我得到了”你的代码,但现在我不知道如何“调用它”。我遇到的每个教程都提到调用函数并返回值。我处理文件。为什么我要打印一个值?!