Рубрики
Без рубрики

Многопроцессорная Обработка В Python

Эй, ребята! В этой статье мы узнаем о многопроцессорной обработке в Python. Итак, давайте начнем.

Автор оригинала: 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, которые позволяют лучше использовать ядра процессора и повышают производительность.

Рекомендации

Официальная документация по модулю