В вашем фрагменте кода вы вводите dataSets , который является списком некоторого неопределенного размера. У вас есть функция processImages , которая принимает элемент dataSet и, по-видимому, возвращает значение, которое вы хотите захватить.
cpu_count == длина набора данных?
Первая проблема, которую я заметил, этотот os.cpu_count () управляет диапазоном значений i , который затем определяет, какие наборы данных вы обрабатываете. Я предполагаю, что вы предпочли бы, чтобы эти две вещи были независимыми. То есть вы хотите иметь возможность сократить некоторое количество наборов данных X, и вы хотите, чтобы оно работало на любой машине, имеющей от 1 до 1000 (или более ...) ядер.
Отдельно от процессораограниченная работа
Я также собираюсь предположить, что вы уже определили, что задача действительно связана с процессором, поэтому имеет смысл разделить ее по ядрам. Если вместо этого ваша задача связана с диском, вам нужно больше рабочих. Вы также можете быть привязаны к памяти или кешу. Если для вас важно оптимальное распараллеливание, вам следует подумать о том, чтобы провести несколько испытаний, чтобы определить, какое количество работников действительно дает вам максимальную производительность.
Вот еще чтение , если вам нравится
Класс пула
В любом случае, как упоминал Майкл Бучер, класс пула упрощает это для вас. Ваш стандартный вариант использования. У вас есть набор работы, которую нужно выполнить (ваш список наборов данных для обработки) и количество рабочих, которые должны это сделать (во фрагменте кода - количество ядер).
TLDR
Используйте такие простые концепции многопроцессорной обработки, как это:
from multiprocessing import Pool
# Renaming this variable just for clarity of the example here
work_queue = datasets
# This is the number you might want to find experimentally. Or just run with cpu_count()
worker_count = os.cpu_count()
# This will create processes (fork) and join all for you behind the scenes
worker_pool = Pool(worker_count)
# Farm out the work, gather the results. Does not care whether dataset count equals cpu count
processed_work = worker_pool.map(processImages, work_queue)
# Do something with the result
print(processed_work)