Realizar un procesamiento paralelo en Python
- Utilice el grupo de procesamiento y sus métodos para realizar multiprocesamiento en Python
-
Utilice la función
apply_async()
para realizar multiprocesamiento en Python -
Utilice las funciones
map()
ymap_sync()
para realizar multiprocesamiento 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étodoget()
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