Sin embargo, puede lograr el paralelismo utilizando el multiprocesamiento, lo que evita el GIL creando múltiples procesos. Así es como puede implementar el procesamiento paralelo en Python utilizando un `for` bucle y la biblioteca de 'multiprocesamiento':
Método 1:Uso de `multiprocesamiento.pool.map` (más simple para muchas operaciones idénticas)
Este es el enfoque más fácil si cada iteración de su bucle realiza la misma operación en diferentes datos. `Pool.Map` distribuye eficientemente el trabajo en múltiples procesos.
`` `Python
importar multiprocesamiento
Def process_item (elemento):
"" "La función se ejecutará en paralelo para cada elemento". ""
# Su código para procesar un solo elemento va aquí
# ... un poco de cálculo ...
Resultado de retorno # devuelve el resultado del cálculo
Si __name__ =='__main__':# importante para la compatibilidad de Windows
datos =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # sus datos
con multiprocesamiento.pool (procesos =multiprocessing.cpu_count ()) como grupo:
Resultados =Pool.map (Process_item, Data)
Imprimir (resultados)
`` `` ``
Este código crea un grupo de procesos de trabajadores (igual al número de núcleos de CPU de forma predeterminada). `Pool.map` aplica` process_item` a cada elemento en `data` simultáneamente, y devuelve una lista de los resultados en el mismo orden que la entrada.
Método 2:usando `multiprocesamiento.pool.apply_async` (para escenarios más complejos o operaciones asíncronas)
Si su bucle implica operaciones lógicas o asincrónicas más complejas, `Aplice_async` ofrece más control.
`` `Python
importar multiprocesamiento
Def process_item (elemento):
# ... tu código ...
Resultado de retorno
Si __name__ =='__main__':
Datos =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Resultados =[]
con multiprocesamiento.pool (procesos =multiprocessing.cpu_count ()) como grupo:
# APLICE_ASYNC Devuelve un objeto AsyncreSult
async_results =[Pool.apply_async (process_item, (item,)) para el elemento en los datos]
# Obtenga los resultados (bloqueando hasta que se completen todos los procesos)
para async_result en async_results:
Results.append (async_result.get ())
Imprimir (resultados)
`` `` ``
`APLICE_ASYNC` le permite enviar tareas individualmente y recuperar los resultados más tarde. Esto es útil si el tiempo de procesamiento para cada elemento varía significativamente.
Consideraciones importantes:
* `if __name__ =='__main __':`: Esto es crucial, especialmente en las ventanas, para evitar la creación de procesos recursivos.
* Compartir datos: Evite compartir datos mutables directamente entre procesos. Use técnicas como colas o tuberías para la comunicación entre procesos para prevenir las condiciones de carrera.
* Overhead: La creación y la gestión de procesos tiene una sobrecarga. El procesamiento paralelo es más beneficioso para las tareas computacionalmente intensivas en las que el tiempo de procesamiento supera significativamente la sobrecarga.
* Número de procesos: El número óptimo de procesos a menudo es igual al número de núcleos de CPU, pero podría ser necesaria la experimentación.
Recuerde reemplazar `# ... su código ...` Con su cálculo real. Elija el método que mejor se adapte a la estructura y la complejidad de sus operaciones de 'For` Loop. Para operaciones simples y amigables con el paralelo, `piscina.map` suele ser el enfoque preferido y más eficiente.