Параллелизм не всегда прост, но, разбив наш код на форму, которая может быть применена к карте, мы можем легко настроить его для параллельного запуска!
Карта-это встроенная функция более высокого порядка, которая применяет заданную функцию к каждому элементу списка, возвращая список результатов.
Библиотека multiprocessing
обычно используется для отдельных процессов, однако у нее есть аккуратный фиктивный
модуль, который работает над потоками. На самом деле, это настолько тривиально, что вам нужно только установить количество потоков и дать ему свою функцию для отображения. Этот метод делает всю тяжелую работу за вас.
Не веришь мне? Проверьте это сами, давайте возведем в квадрат кучу чисел параллельно:
Пример кода
from multiprocessing.dummy import Pool as ThreadPool def squareNumber(n): return n ** 2 # function to be mapped over def calculateParallel(numbers, threads=2): pool = ThreadPool(threads) results = pool.map(squareNumber, numbers) pool.close() pool.join() return results if __name__ == "__main__": numbers = [1, 2, 3, 4, 5] squaredNumbers = calculateParallel(numbers, 4) for n in squaredNumbers: print(n)
Количество потоков обычно будет эквивалентно количеству ядер, которые у вас есть. Если у вас есть гиперпоточность на вашем процессоре, вы сможете удвоить количество используемых потоков.
Возвращаемые результаты будут просто стандартным списком всех квадратных чисел в этом примере. Слишком просто, верно?