Realizar un procesamiento paralelo en Python

Najwa Riyaz 30 enero 2023
  1. Utilice el grupo de procesamiento y sus métodos para realizar multiprocesamiento en Python
  2. Utilice la función apply_async() para realizar multiprocesamiento en Python
  3. Utilice las funciones map() y map_sync() para realizar multiprocesamiento en Python
Realizar un procesamiento paralelo en Python

Este artículo explica cómo ejecutar varios procesos en paralelo en Python.

Utilice el grupo de procesamiento y sus métodos para realizar multiprocesamiento en Python

Para realizar multiprocesamiento en Python, siga los siguientes pasos.

  • Primero, importe el módulo multiprocessing.
  • Utilice la clase Pool para definir el grupo de procesamiento de Python. Este grupo representa un grupo de procesos de trabajo. Tome el siguiente fragmento de código como ejemplo.
Pool(processes=n)

En consecuencia, la clase Pool permitirá que el número n de procesos se ejecuten simultáneamente. Esta clase contiene métodos que permiten la delegación de tareas a los procesos de trabajo del Pool.

Los siguientes son algunos de los métodos de la clase Pool.

  • Pool.map() - Utilice este método de bloqueo del Pool para bloquear hasta que el resultado esté listo. Este método corta el iterable asociado en varios trozos. Luego, envía los fragmentos al grupo de procesos como tareas independientes.

  • Utilice los siguientes métodos de no bloqueo de la clase Pool para enviar los procesos simultáneamente a la vez. Utilice el método get() para obtener los resultados de la función.

  • Pool.apply_async()

  • Pool.map_async()

Para determinar la cantidad de procesos que su máquina puede manejar para multiprocesamiento, debe saber la cantidad de procesadores que tiene en su dispositivo; puede verificar esto usando el siguiente código.

import multiprocessing as mp

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

Producción :

Number of processors:  4

Utilice la función apply_async() para realizar multiprocesamiento en Python

Aquí hay un ejemplo que demuestra el multiprocesamiento usando el grupo de procesamiento en Python mientras se determina el cuadrado de un rango en números del 0 al 9.

Tenga en cuenta que aquí, incluso hemos impreso el nombre del trabajador del proceso, que es opcional.

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)))

Producción :

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]

Utilice las funciones map() y map_sync() para realizar multiprocesamiento en Python

La función map_async no es bloqueante, mientras que la función map es bloqueante. A continuación se muestra un ejemplo que demuestra la diferencia entre estos dos comandos.

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")

Aquí, podemos observar que la función pool.map() esperará a que se completen las 10 llamadas de operación. Por lo tanto, vemos el resultado impreso en orden.

Además, pool.map_async() ejecutará las 10 llamadas a funciones de forma asincrónica. Cuando se llama a la función r.wait(), bloquea el procesador para su ejecución. Por lo tanto, en la salida, vemos los mensajes de impresión como First print y Second print en el medio, pero la Third print siempre estará al final.

Producción :

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

Artículo relacionado - Python Process