проблема с использованием потоков вместо процессов в Python - PullRequest
0 голосов
/ 29 сентября 2019

так что я нашел учебник по многопроцессорности и многопоточности на 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.

1 Ответ

0 голосов
/ 29 сентября 2019

Мне удалось решить эту проблему, добавив аргумент max_workers в пул, опять же, кто-нибудь знает, зачем это было нужно?я подумал, что если я не укажу значение, то пул позаботится об этом и будет использовать как можно больше для моей системы.

with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:

кажется, что он тормозит, если я пытаюсь использоватьслишком большое количество потоков или процессов, чем может обработать мой процессор, я использую процессор i7 4790K (4 ядра, 8 потоков), поэтому всякий раз, когда я пытался использовать более 8 потоков или процессов, программа перестала обрабатывать следующие фотографии после выполнения примерно половиныиз них

...