Автор оригинала: Pankaj Kumar.
Эй, ребята! В этой статье мы узнаем о многопроцессорной обработке в Python. Итак, давайте начнем.
Что такое многопроцессорная обработка?
Многопроцессорная обработка-это пакет в python, который поддерживает возможность порождать процессы, использующие API Python. Это похоже на модуль потоковой передачи в Python.
Понимание многопроцессорной обработки в Python
Многопроцессор – это компьютер, означающий, что компьютер имеет более одного центрального процессора. Если компьютер имеет только один процессор с несколькими ядрами, задачи могут выполняться параллельно с использованием многопоточности в Python .
Многопроцессорная система имеет возможность поддерживать более одного процессора одновременно. Чтобы найти количество ядер процессора, доступных в нашей системе, мы используем функцию mp.cpu_count () .
В этой статье мы будем использовать модуль многопроцессорной обработки Python
Вот пример кода для поиска количества процессоров в Python с помощью модуля многопроцессорной обработки:
import multiprocessing as mp print(mp.cpu_count())
Выход: 12
Подсчет здесь-это общее количество ядер между несколькими процессорами, суммированное.
Четыре наиболее важных класса этого модуля-
- Класс процесса
- Класс блокировки
- Класс очереди
- Класс бассейна
Давайте рассмотрим каждый из этих классов по отдельности…
1. Класс процесса
Процесс-это раздвоенная копия текущего процесса. Он создает новый идентификатор процесса и задачи, выполняемые как независимый дочерний процесс.
функции start() и join() принадлежат к этому классу. Чтобы передать аргумент через процесс, мы используем ключевое слово args .
Пример функции start() –
Здесь мы создали функцию calc_square и calc_cube для нахождения квадрата и куба числа соответственно. В основной функции мы создали объекты p1 и p2 . p1.start() и p2.start() запустит функцию и вызов p1.join() и p2.join завершит процесс.
import time import multiprocessing def calc_square(numbers): for n in numbers: print('square ' + str(n*n)) def calc_cube(numbers): for n in numbers: print('cube '+ str(n*n*n)) if __name__ == "__main__": arr=[2,3,8,9] p1=multiprocessing.Process(target=calc_square,args=(arr,)) p2=multiprocessing.Process(target=calc_cube,args=(arr,)) p1.start() p2.start() p1.join() p2.join() print("Done")
Выход:
square 4 square 9 square 64 square 81 cube 8 cube 27 cube 512 cube 729 Done
2. Класс блокировки
Класс блокировки позволяет заблокировать код, чтобы убедиться, что ни один другой процесс не сможет выполнить аналогичный код, пока он не будет освобожден.
Для утверждения блокировки используется функция acquire() , а для снятия блокировки используется функция release () .
from multiprocessing import Process, Lock lock=Lock() def printer(data): lock.acquire() try: print(data) finally: lock.release() if __name__=="__main__": items=['mobile','computer','tablet'] for item in items: p=Process(target=printer,args=(item,)) p.start()
Выход
mobile computer tablet
3. Класс очереди
Очередь-это структура данных, которая использует метод First In First Out (FIFO).Это помогает нам выполнять взаимодействие между процессами с использованием собственных объектов Python.
Очередь позволяет процессу использовать общие данные при передаче в качестве параметра.
функция put() используется для вставки данных в очередь, а функция get() используется для использования данных из очереди.
import multiprocessing as mp def sqr(x,q): q.put(x*x) if __name__ == "__main__": q=mp.Queue() # Instance of queue class created processes=[mp.Process(target=sqr,args=(i,q))for i in range (2,10)] # List of processes within range 2 to 10 for p in processes: p.start() for p in processes: p.join() result = [q.get() for p in processes] print(result)
Выход:
[4, 9, 16, 25, 36, 64, 49, 81]
4. Класс бассейна
Класс pool помогает нам выполнять функцию с несколькими входными значениями параллельно. Эта концепция называется параллелизмом данных.
Здесь массив [5,9,8] отображается в качестве входных данных в вызове функции. функция pool.map() используется для передачи списка из нескольких аргументов.
import multiprocessing as mp def my_func(x): print(x**x) def main(): pool = mp.Pool(mp.cpu_count()) result = pool.map(my_func, [5,9,8]) if __name__ == "__main__": main()
Выход:
3125 387420489 16777216
Вывод
В этой статье мы изучили четыре наиболее важных класса многопроцессорной обработки в Python – Process, Lock, Queue и Pool, которые позволяют лучше использовать ядра процессора и повышают производительность.
Рекомендации
Официальная документация по модулю