我试图用Python包围MultiProcessing,但我根本无法做到。请注意,我是,我可能永远是一切编程中的菜鸟。啊,反正。在这里。
我正在编写一个Python脚本,使用ImageMagick压缩下载到文件夹的图像,使用来自用户的预定义变量,存储在ini文件中。脚本搜索与下载目录中的模式匹配的文件夹,检查它们是否包含JPG,PNG或其他图像文件,如果是,则重新压缩并重命名它们,将结果存储在"压缩"文件夹中。
现在,事情就是这样:如果我能够"并行化"我会喜欢它。整个压缩的东西,但是...我无法理解我应该怎么做。
我不想用现有的代码让你疲惫不堪,因为它很糟糕。它只是一个简单的"目录中的文件"环。这就是我喜欢并行化的东西 - 有人能给我一个关于如何在目录中使用多处理文件的例子吗?
我的意思是,让我们采用这段简单的代码:
表示match_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)
...在这里,我希望能够添加一段代码,其中一个工作者从Original_Image_FileList获取第一个文件并将其压缩为Processed_Image_FileList中的第一个文件名,第二个文件在此之后获取一个,等等,特定数量的工人 - 取决于ini文件中的用户设置。
有什么想法吗?
答案 0 :(得分:1)
您可以使用Pool
类创建工作池,您可以将图像压缩分发到该类。请参阅multiprocessing
文档的Using a pool of workers部分。
例如,如果您的压缩函数被称为compress(filename)
,那么您可以使用Pool.map
方法将此函数应用于返回文件名的迭代,即列表matching_directory
:
from multiprocessing import Pool
def compress_image(image):
"""Define how you'd like to compress `image`..."""
pass
def distribute_compression(images, pool_size = 4):
with Pool(processes=pool_size) as pool:
pool.map(compress_image, images)
有各种类似地图的方法,请参阅map作为初学者。您可能希望尝试使用池大小,以查看哪种方法效果最佳。