teclado - mostrar resultados en python
¿Admite python la programación multiprocesador/multinúcleo? (8)
¿Cuál es la diferencia entre la programación multiprocesador y la programación multinúcleo? preferiblemente mostrar ejemplos en Python cómo escribir un pequeño programa para multiprogramación y programación multinúcleo
Como se menciona en otra publicación, Python 2.6 tiene el módulo de multiprocessing , que puede aprovechar múltiples núcleos / procesadores (se mueve alrededor de GIL al iniciar múltiples procesos de forma transparente). Ofrece algunas primitivas similares al módulo de subprocesamiento. Encontrará algunos ejemplos (simples) de uso en las páginas de documentación.
En realidad puede escribir programas que usarán procesadores múltiples. No puede hacerlo con subprocesos debido al bloqueo de GIL, pero puede hacerlo con un proceso diferente. Ya sea:
- utilice el módulo de subprocess y divida su código para ejecutar un proceso por procesador
- echa un vistazo al módulo parallelpython
- si usa python> 2.6, eche un vistazo al módulo multiprocess .
La principal diferencia es cómo organizar y distribuir los datos. Multicore típicamente tiene anchos de banda más altos entre los diferentes núcleos en una CPU, y el multiprocesador necesita involucrar más al bus entre la CPU.
Python 2.6 ha obtenido multiprocesos (proceso, como en el programa en ejecución) y más objetos de sincronización y comunicación para programación multiproceso.
No existe la programación de "multiprocesador" o "multinúcleo". La distinción entre computadoras "multiprocesador" y "multinúcleo" probablemente no sea relevante para usted como programador de aplicaciones; tiene que ver con las sutilezas de cómo los núcleos comparten el acceso a la memoria.
Para aprovechar una computadora multinúcleo (o multiprocesador), necesita un programa escrito de manera tal que se pueda ejecutar en paralelo y un tiempo de ejecución que permita que el programa se ejecute en paralelo en múltiples núcleos (y sistema operativo, aunque cualquier sistema operativo que pueda ejecutar en su PC lo hará). Esta es una programación realmente paralela , aunque existen diferentes enfoques para la programación paralela. Los que son relevantes para Python son multiprocesamiento y multihilo.
En idiomas como C, C ++, Java y C #, puede escribir programas paralelos ejecutando múltiples hilos. El bloqueo de intérprete global en los tiempos de ejecución CPython y PyPy excluye esta opción; pero solo para esos tiempos de ejecución. (En mi opinión personal, el multihilo es peligroso y engañoso, y generalmente es bueno que Python lo aliente a no considerarlo como una forma de obtener una ventaja de rendimiento).
Si desea escribir un programa paralelo que se puede ejecutar en múltiples núcleos en Python, tiene algunas opciones diferentes:
- Escriba un programa multiproceso utilizando el módulo de
threading
y ejecútelo en el tiempo de ejecución de IronPython o Jython. - Utilice el módulo de
processing
(ahora incluido en Python 2.6 como módulo demultiprocessing
) para ejecutar su código en múltiples procesos a la vez. - Use el módulo de
subprocess
para ejecutar múltiples intérpretes de Python y comunicarse entre ellos. - Use Twisted y Ampoule . Esto tiene la ventaja de no solo ejecutar su código en diferentes procesos, sino también (si no comparte el acceso a cosas como archivos) también en diferentes computadoras.
No importa cuál de estas opciones elijas, necesitarás entender cómo dividir el trabajo que tu programa está haciendo en pedazos que tienen sentido separar. Como no estoy seguro de qué tipo de programas está pensando escribir, sería difícil proporcionar un ejemplo útil.
Puede leer sobre multithreading en python y enhebrar en general
Multithreading en Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
Recuerde siempre, sin embargo, que si también le preocupa el rendimiento, usar Python es un problema. Es realmente lento comparado, por ejemplo, con Java o C #, porque todavía se interpreta y no se compila con JIT, y el intérprete no es muy eficiente. Para hacerlo más rápido, las recomendaciones más populares (que van desde la creación manual en línea hasta la escritura de extensiones C) hacen que su programa sea menos legible. Por lo tanto, usar Java o C # podría ser una opción mucho mejor, especialmente si necesita comenzar de cero de todos modos.
Cosas como Psyco no, pero Psyco tiene algunos errores y no acelera todo el código. Y aún así no admiten multihilo.
Jython e IronPython son compatibles con multithreading real. Sin embargo, Jython, en cambio, es incluso más lento que CPython, mientras que IronPython no es más rápido que CPython, incluso si se ejecuta sobre una VM eficiente, con compilación JIT, por ejemplo.
Si entiendo las cosas correctamente, Python tiene algo llamado GIL (Global Interpreter Lock) que efectivamente hace que sea imposible aprovechar las multinúcleas cuando se hacen múltiples subprocesos en Python.
Ver, por ejemplo, la entrada del blog de Guido van Rossum sobre el tema. Hasta donde yo sé, entre los lenguajes "convencionales" solo C / C ++ y Java tienen soporte efectivo para multinúcleos.
Si no tiene Python 2.6 (que no usa si usa Ubuntu Edgy o Intrepid por ejemplo), puede usar la versión de multiprocesamiento de código de Google soportado . Es parte de PyPI, lo que significa que puedes instalarlo fácilmente usando EasyInstall (que es parte del paquete python-setuptools en Ubuntu).