multiprocesamiento - multitarea en python
¿multiprocesamiento o subprocesamiento en python? (8)
Considere buscar en Stackless Python . Si tiene control sobre la función que lleva mucho tiempo, puede simplemente lanzar algunos stackless.schedule()
s allí (diciendo ceder el paso a la siguiente coroutine), o bien puede establecer Stackless para la multitarea preventiva .
En Stackless, no tienes hilos, sino tasklets o greenlets que son esencialmente hilos muy ligeros. Funciona de maravilla en el sentido de que hay un marco bastante bueno con muy poca configuración para realizar múltiples tareas.
Sin embargo, Stackless dificulta la portabilidad porque debe reemplazar algunas de las bibliotecas estándar de Python: Stackless elimina la dependencia de la pila C. Es muy portátil si el siguiente usuario también tiene Stackless instalado, pero rara vez será el caso.
Tengo una aplicación de Python que toma una colección de datos y para cada pieza de datos en esa colección realiza una tarea. La tarea tarda un tiempo en completarse ya que hay un retraso involucrado. Debido a este retraso, no quiero que cada dato realice la tarea posteriormente, quiero que todos sucedan en paralelo. ¿Debo usar multiprocesos? o enhebrar para esta operación?
Intenté utilizar el enhebrado pero tuve algunos problemas, a menudo algunas de las tareas nunca se activaron.
El uso del modelo de subprocesamiento de CPython no le proporcionará ninguna mejora en el rendimiento, ya que los subprocesos en realidad no se ejecutan en paralelo, debido a la forma en que se maneja la recolección de elementos no utilizados. El multiproceso permitiría la ejecución paralela. Obviamente, en este caso, debe tener múltiples núcleos disponibles para cultivar sus trabajos paralelos.
Hay mucha más información disponible en esta pregunta relacionada .
Es posible que desee ver Twisted . Está diseñado para tareas de red asíncronas.
IronPython tiene verdadero multihilo, a diferencia de CPython y es GIL. Entonces, dependiendo de lo que estés haciendo, puede valer la pena mirarlo. Pero parece que su caso de uso se adapta mejor al módulo de multiprocesamiento.
Para el tipo que recomienda python sin apilamiento, no soy un experto en eso, pero me parece que está hablando de software "multihilo", que en realidad no es para nada paralelo (todavía se ejecuta en un hilo físico, por lo que no puede escalar a múltiples núcleos). Es simplemente una forma alternativa de estructurar aplicaciones asíncronas (pero aún de un solo subproceso, no paralelas).
Las tareas se ejecutan de forma secuencial, pero tiene la ilusión de que se ejecutan en paralelo. Las tareas son buenas cuando se utiliza para E / S de archivos o conexiones y porque son ligeras.
El multiproceso con Pool puede ser la solución adecuada para usted porque los procesos se ejecutan en paralelo, por lo que son muy buenos con la informática intensiva porque cada proceso se ejecuta en una CPU (o núcleo).
Configurar multiprocesos puede ser muy fácil:
from multiprocessing import Pool
def worker(input_item):
output = do_some_work()
return output
pool = Pool() # it make one process for each CPU (or core) of your PC. Use "Pool(4)" to force to use 4 processes, for example.
list_of_results = pool.map(worker, input_list) # Launch all automatically
Para pequeñas colecciones de datos, simplemente cree subprocesos con subprocess.Popen . subprocess.Popen .
Cada subproceso simplemente puede obtener su parte de datos de stdin o de argumentos de línea de comandos, hacer su procesamiento y simplemente escribir el resultado en un archivo de salida.
Cuando todos los subprocesos han terminado (o se ha agotado el tiempo de espera), simplemente fusiona los archivos de salida.
Muy simple.
Si puede dividir y separar fácilmente los datos que tiene, parece que debería hacer esa partición externamente y alimentarlos a varios procesos de su programa. (es decir, varios procesos en lugar de hilos)
Si realmente está obligado a calcular, usar el módulo de multiprocesamiento es probablemente la solución de menor peso (en términos de consumo de memoria y dificultad de implementación).
Si está vinculado a E / S, usar el módulo de subprocesos generalmente le dará buenos resultados. Asegúrese de utilizar el almacenamiento seguro de subprocesos (como la cola) para entregar datos a sus subprocesos. O bien, proporciónales una única pieza de datos que sea única para ellos cuando se generen.
PyPy se centra en el rendimiento. Tiene una serie de características que pueden ayudar con el procesamiento de procesamiento computarizado. También tienen soporte para Software Transactional Memory, aunque todavía no es calidad de producción. La promesa es que puede usar mecanismos paralelos o concurrentes más simples que el multiprocesamiento (que tiene algunos requisitos incómodos).
Stackless Python es también una buena idea. Stackless tiene problemas de portabilidad como se indicó anteriormente. Unladen Swallow fue prometedor, pero ahora está extinto. Pyston es otra implementación de Python (inacabada) centrada en la velocidad. Adopta un enfoque diferente de PyPy, que puede producir mejores (o solo diferentes) aceleraciones.