所以我在Corey Schafer的youtube上找到了有关多处理和线程的教程。 在多处理视频中,我们有15张照片要添加模糊效果,然后将它们添加到存在的另一张名为“已处理”的文件夹中。
import time
import concurrent.futures
from PIL import Image, ImageFilter
img_names = [
'photo-1516117172878-fd2c41f4a759.jpg',
'photo-1532009324734-20a7a5813719.jpg',
'photo-1524429656589-6633a470097c.jpg',
'photo-1530224264768-7ff8c1789d79.jpg',
'photo-1564135624576-c5c88640f235.jpg',
'photo-1541698444083-023c97d3f4b6.jpg',
'photo-1522364723953-452d3431c267.jpg',
'photo-1513938709626-033611b8cc03.jpg',
'photo-1507143550189-fed454f93097.jpg',
'photo-1493976040374-85c8e12f0c0e.jpg',
'photo-1504198453319-5ce911bafcde.jpg',
'photo-1530122037265-a5f1f91d3b99.jpg',
'photo-1516972810927-80185027ca84.jpg',
'photo-1550439062-609e1531270e.jpg',
'photo-1549692520-acc6669e2f0c.jpg'
]
def process_image(img_name):
size = (1200,1200)
img = Image.open(img_name)
img = img.filter(ImageFilter.GaussianBlur(15))
img.thumbnail(size)
img.save(f'processed/{img_name}')
print(f"{img_name} was processed")
def main():
t1 = time.perf_counter()
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(process_image,img_names)
t2 = time.perf_counter()
print(f"finished in {t2-t1} seconds")
if __name__ == "__main__":
main()
问题是,当我尝试使用
with concurrent.futures.ThreadPoolExecutor() as executor:
不是我现在要看到线程处理要花多长时间,然后只有一半的图片被处理并添加到新文件夹中,所以一切正常
with concurrent.futures.ProcessPoolExecutor() as executor:
,但不支持线程。有人可以解释为什么吗?
所有照片都保存在我现在使用python文件打开的同一文件夹中。
答案 0 :(得分:0)
我设法通过在池中添加max_workers arg来解决该问题,有人知道为什么需要这样做吗?我以为,如果我不给它一个值,那么池将解决这个问题并为我的系统使用尽可能多的值。
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
如果我尝试使用过多的线程或进程超出我的CPU无法处理的速度,这似乎会制止,我正在运行i7 4790K(4核,8线程)CPU,因此无论何时我尝试使用8个以上的线程或处理程序,运行大约一半后停止处理下一张照片