Почему многопроцессорная обработка.Пул работает медленнее при большом количестве элементов

#image #multiprocessing #pool

#изображение #многопроцессорная обработка #Бассейн

Вопрос:

Я использую многопроцессорную обработку.Объедините вместе с apply_async() для обработки большого количества изображений (около 1000).

Я настроил пул на использование 4 процессов.

Моя проблема заключается в том, как изменяется скорость обработки изображений в зависимости от количества обрабатываемых элементов.

Например, когда пул заполнен 10 элементами, эти элементы обрабатываются за 0,5 секунды.

Когда один и тот же код выполняется для 1000 элементов, первые 10 элементов обрабатываются за 10 секунд.

Почему это? Я бы ожидал увеличения длины выполнения всей работы, но не скорости обработки изображений.

Вот код:

 imagelist = [...] # array of images(pixel data)
pool = Pool(processes=4)
for i, image in enumerate(imagelist):
    a = pool.apply_async(process, args=(image), callback=postprocess)
  

Я бы ожидал, что скорость обработки изображений будет постоянной, независимо от количества обрабатываемых элементов. Почему это не так?

Комментарии:

1. Я не эксперт, но я бы сказал так: вы запускаете процесс для всех них, поэтому процессор намного больше переключается между каждым потоком, оставляя меньше времени для выполнения вашего фактического процесса. Я не знаю, из чего состоит ваш процесс, но будьте уверены, что он либо выполняет длительное вычисление, либо какой-то блокирующий процесс (например, загрузка или что-то в этом роде). В противном случае это не так полезно

2. @DimitriBosteels Процесс представляет собой функцию обработки изображений с использованием OpenCV. Обычно для завершения требуется около секунды или двух. Вы думаете, это слишком быстро?

3. нет, но тогда почему на 10 изображений уходит менее 1 секунды, если на каждый процесс уходит 1-2 секунды, но это нормально, если вы проверяете только время выполнения для первых элементов. Асинхронное программирование менее эффективно, когда коллекция невелика. Поэтому вместо этого сравните время выполнения для всей коллекции 🙂 Ну, простой способ проверить, быстрее ли это, — сделать это асинхронно и синхронно, с таймером и проверить прошедшее время для одного или другого.

4. Размер изображений одинаков для каждого изображения или он меняется от изображения к изображению?

5. @DimitriBosteels попытается рассчитать время