Descubrí que en Python 3.4 hay pocas bibliotecas diferentes para multiprocesamiento / subprocesamiento: multiprocesamiento vs subprocesamiento vs asyncio .
Pero no sé cuál usar o es el "recomendado". ¿Hacen lo mismo o son diferentes? Si es así, ¿cuál se usa para qué? Quiero escribir un programa que use multinúcleos en mi computadora. Pero no sé qué biblioteca debería aprender.
python
multithreading
python-3.x
multiprocessing
python-asyncio
usuario3654650
fuente
fuente
Respuestas:
Están pensados para propósitos y / o requisitos (ligeramente) diferentes. CPython (una implementación típica de Python en la línea principal) todavía tiene el bloqueo de intérprete global, por lo que una aplicación multiproceso (una forma estándar de implementar el procesamiento paralelo en la actualidad) no es óptima. Es por eso que
multiprocessing
puede ser preferiblethreading
. Pero no todos los problemas pueden dividirse de manera efectiva en partes [casi independientes], por lo que puede haber una necesidad de comunicaciones intensas entre procesos. Es por eso quemultiprocessing
puede que no se prefierathreading
en general.asyncio
(esta técnica está disponible no solo en Python, otros lenguajes y / o frameworks también la tienen, por ejemplo, Boost.ASIO ) es un método para manejar de manera efectiva muchas operaciones de E / S desde muchas fuentes simultáneas sin necesidad de ejecución de código paralelo . Así que es solo una solución (¡muy buena!) Para una tarea en particular, no para el procesamiento paralelo en general.fuente
[Respuesta rápida]
TL; DR
Tomando la decisión correcta:
Referencia
[ NOTA ]:
asyncio
bucle de eventos ultrarrápido ( uvloop haceasyncio
2-4 veces más rápido).[ACTUALIZACIÓN (2019)]:
fuente
asyncio
cuando usa las funciones de espera, larequest
biblioteca no es un método de espera, en lugar de eso, puede usarlo, como laaiohttp
biblioteca o la solicitud asíncrona, etc.Esta es la idea básica:
Así que, básicamente, apégate al subproceso a menos que tengas problemas de IO / CPU.
fuente
En el multiprocesamiento , aprovecha varias CPU para distribuir sus cálculos. Dado que cada una de las CPU se ejecuta en paralelo, puede ejecutar varias tareas simultáneamente. Querría utilizar multiprocesamiento para tareas vinculadas a la CPU . Un ejemplo sería intentar calcular la suma de todos los elementos de una lista enorme. Si su máquina tiene 8 núcleos, puede "cortar" la lista en 8 listas más pequeñas y calcular la suma de cada una de esas listas por separado en un núcleo separado y luego simplemente sumar esos números. Obtendrá una aceleración de ~ 8x al hacer eso.
En hilono necesita varias CPU. Imagine un programa que envía muchas solicitudes HTTP a la web. Si usó un programa de un solo subproceso, detendría la ejecución (bloque) en cada solicitud, esperaría una respuesta y luego continuaría una vez que se recibiera una respuesta. El problema aquí es que su CPU no está realmente funcionando mientras espera que algún servidor externo haga el trabajo; ¡podría haber hecho un trabajo útil mientras tanto! La solución es usar hilos: puede crear muchos de ellos, cada uno responsable de solicitar algún contenido de la web. Lo bueno de los subprocesos es que, incluso si se ejecutan en una CPU, la CPU de vez en cuando "congela" la ejecución de un subproceso y salta a la ejecución del otro (se llama cambio de contexto y ocurre constantemente en condiciones no deterministas intervalos). - utilizar enhebrado.
asyncio es esencialmente un subproceso donde no la CPU sino usted, como programador (o en realidad su aplicación), decide dónde y cuándo ocurre el cambio de contexto . En Python, usa una
await
palabra clave para suspender la ejecución de su corrutina (definida usando unaasync
palabra clave).fuente