Выполните параллельную обработку в Python

  1. Использование пула обработки и его методов для выполнения многопроцессорной обработки в Python
  2. Используйте функцию apply_async() для выполнения многопроцессорной обработки в Python
  3. Используйте функции map() и map_sync() для выполнения многопроцессорной обработки в Python

В этой статье объясняется, как в Python выполнять несколько процессов параллельно.

Использование пула обработки и его методов для выполнения многопроцессорной обработки в Python

Чтобы выполнить многопроцессорную обработку в Python, выполните следующие действия.

  • Сначала импортируйте модуль multiprocessing.
  • Используйте класс Pool для определения пула обработки Python. Этот пул представляет собой пул рабочих процессов. В качестве примера возьмем приведенный ниже фрагмент кода.
Pool(processes=n)

Соответственно, класс Pool позволит запускать n процессов одновременно. Этот класс содержит методы, которые позволяют делегировать задачи рабочим процессам пула.

Ниже приведены некоторые методы класса Pool.

  • Pool.map() - используйте этот метод блокировки пула для блокировки до тех пор, пока результат не будет готов. Этот метод разбивает связанный итерируемый объект на несколько частей. Затем он отправляет фрагменты в пул процессов как отдельные задачи.
  • Используйте следующие неблокирующие методы класса Pool для одновременной одновременной отправки процессов. Используйте метод get() для получения результатов функции.

  • Pool.apply_async()

  • Pool.map_async()

Чтобы определить количество процессов, которые ваша машина может обрабатывать для многопроцессорной обработки, вы должны знать количество процессоров в вашем устройстве; вы можете проверить это, используя следующий код.

import multiprocessing as mp
print("Number of processors: ", mp.cpu_count())

Выход:

Number of processors:  4

Используйте функцию apply_async() для выполнения многопроцессорной обработки в Python

Вот пример, демонстрирующий многопроцессорность с использованием пула обработки в Python при определении квадрата диапазона чисел от 0 до 9.

Обратите внимание, что здесь мы даже напечатали имя рабочего процесса, что необязательно.

from multiprocessing import Pool
from multiprocessing import Process, current_process
import time
from time import sleep
import random
def  fnc_square(x):
    print(current_process().name)
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)
    result = pool.apply_async(fnc_square, [6])
    print( result.get(timeout=1) )
    print (pool.map(fnc_square, range(10)))

Выход:

SpawnPoolWorker-1
36
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
SpawnPoolWorker-2
SpawnPoolWorker-1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Используйте функции map() и map_sync() для выполнения многопроцессорной обработки в Python

Функция map_async является неблокирующей, а функция map - блокирующей. Ниже приведен пример, демонстрирующий разницу между этими двумя командами.

from multiprocessing import Pool
import time

def f(x):
    print (x*x)

if __name__ == '__main__':
    pool = Pool(processes=1)
    pool.map(f, range(10))
    r = pool.map_async(f, range(10))
    print ('First print')
    print ('Second print')
    r.wait()
    print ('Third print')

Здесь мы можем заметить, что функция pool.map() будет ждать завершения 10 вызовов операций. Следовательно, мы видим результат, напечатанный по порядку.

Кроме того, pool.map_async() будет выполнять 10 вызовов функций асинхронно. Когда вызывается функция r.wait(), она блокирует выполнение процессора. Следовательно, в выводе мы видим сообщения печати как First print и Second print между ними, но Third print всегда будет в конце.

Выход:

0
1
4
9
16
25
36
49
64
81
First print
Second print
0
1
4
9
16
25
36
49
64
81
Third print