¿Cuál es la diferencia entre la programación multiprocesador y la programación multinúcleo? preferiblemente muestran ejemplos en Python cómo escribir un pequeño programa para multiprogramación programación & multinúcleo¿Admite python la programación multiprocesador/multinúcleo?
Respuesta
Usted puede leer acerca de múltiples hilos en Python, y con hilo en general,
multihilo en Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
Si entiendo todo 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.
Véase, por ejemplo, blog entry 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.
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 multiproceso (proceso, como en el programa en ejecución) y más objetos de sincronización y comunicación para la programación multiproceso.
Como se mencionó en otra publicación Python 2.6 tiene el módulo multiprocessing, que puede aprovechar múltiples núcleos/procesadores (se mueve alrededor de GIL iniciando 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.
Este tipo de respuestas son sorprendentes ya que los procesos no comparten sus espacios de direcciones, lo que conduce a un modelo de programación sustancialmente diferente. –
No existe la programación de "multiprocesador" o "multinúcleo". La distinción entre computadoras "multiprocesador" y "multinúcleo" probablemente no es 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 forma tal que se pueda ejecutar en paralelo, y un tiempo de ejecución que permita que el programa se ejecute realmente en paralelo en núcleos múltiples (y sistema operativo, aunque cualquier sistema operativo que pueda ejecutar en su PC hará esto). Esto realmente es programación en paralelo, aunque hay diferentes enfoques para la programación en paralelo. Los que son relevantes para Python son multiprocesamiento y multihilo.
En idiomas como C, C++, Java y C#, puede escribir programas paralelos ejecutando varios subprocesos. 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, multihilo es dangerous and tricky 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 pueda ejecutar múltiples núcleos en Python, que tiene algunas opciones diferentes:
- escribir un programa multiproceso utilizando el módulo
threading
y ejecutarlo en el tiempo de ejecución IronPython o Jython. - Utilice el módulo
processing
, (ahora incluido en Python 2.6 como el módulomultiprocessing
), para ejecutar su código en múltiples procesos a la vez. - Utilice el módulo
subprocess
para ejecutar múltiples intérpretes de Python y comunicarse entre ellos. - Utilice 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 fragmentos que tienen sentido separar. Como no estoy seguro de qué tipo de programas está pensando escribir, sería difícil proporcionar un ejemplo útil.
* No existe la programación de "multiprocesador" o "multinúcleo" *, seguro que sí. La programación * Multicore * consiste en escribir aplicaciones que aprovechan múltiples núcleos. – johndodo
¿A diferencia de las aplicaciones que aprovechan múltiples procesadores? – Glyph
Esas son aplicaciones multiprocesador ... No estoy seguro de si entendí bien el asunto. Quería decir esto: la mayoría de las personas entiende qué significan "programación multinúcleo" y "programación multiprocesador".Entonces, la pregunta del OP podría traducirse a "¿Es posible escribir programas que se ejecutan en múltiples núcleos/procesadores en python?" Los términos que dices no son válidos, bueno, lo son. Eso es todo lo que quería agregar. – johndodo
En realidad, puede escribir programas que utilizarán múltiples procesadores. No puede hacerlo con subprocesos debido al bloqueo de GIL, pero puede hacerlo con un proceso diferente. O bien:
- uso del módulo subprocess, y dividir su código para ejecutar un proceso por procesador
- echar un vistazo a parallelpython módulo
- si usar Python> 2,6 echar un vistazo al módulo multiprocess.
Los subprocesos y python se dividirán en varios núcleos, pero algunos de esos núcleos (todos menos uno, a menos que haga algo de magia en C) simplemente estarán esperando el GIL. Esta es la razón por la que antes de Python 3.2, los hilos enlazados a la CPU funcionan mejor en máquinas de un solo núcleo que en máquinas de múltiples núcleos. – Chad
Algunos módulos se implementan en C y lanzarán el GIL. El módulo zlib (también utilizado por el módulo gzip) es uno de estos. Puede usar múltiples núcleos para descomprimir o comprimir datos usando múltiples hilos en python. Existen otros ejemplos en la biblioteca estándar (biblioteca de expresiones regulares) y algunas otras bibliotecas de terceros, como net-snmp entre otros. –
@WillPierce que dice "Se puede hacer, y muy bien, pero solo si no usas Python". Puedo escribir un módulo C para usar en casi cualquier idioma. Eso es una ventaja para C, pero solo destaca los fallos de Python. – Basic
Recuerda siempre, sin embargo, que si te 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 que sea 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 y IronPython admiten multihilo 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.
¿Alguien quiere explicar su downvotes? – Blaisorblade
No te devolví el voto. Pero no hay absolutamente ninguna razón para abandonar Python. El 95% del código que cualquier persona escribe debe estar optimizado para su legibilidad, no para el rendimiento de bajo nivel. Para el 5% de rendimiento restante hace una gran diferencia. Me quedaré con C por eso, gracias, Java no será lo suficientemente rápido. Con las herramientas adecuadas, una extensión de Python C puede ser muy fácil de leer y simple. (Y con las herramientas incorrectas, será aún menos legible que sin herramientas). Solo puedo concluir que nunca lo has intentado realmente. – maxy
No he escrito las extensiones de Python C, solo tengo suficiente experiencia programando en C para saber qué tan difícil es Python. Además, las extensiones C eran solo un punto lateral. – Blaisorblade
Si no tiene Python 2.6 (que no si usa Ubuntu Edgy o Intrepid por ejemplo), puede usar la versión Google code backported de multiprocesamiento. Es parte de PyPI, lo que significa que puedes instalarlo fácilmente usando EasyInstall (que es parte del paquete python-setuptools en Ubuntu).
- 1. ¿Admite PySide Python 3?
- 2. ¿Webdriver admite pagefactory para Python?
- 3. programación lineal en python?
- 4. programación asincrónica en python
- 5. ¿Admite Python copia cero de E/S?
- 6. Servidor Python HTTP que admite codificación fragmentada?
- 7. ¿Multiprocesamiento.Pool de Python admite subprocesos remotos?
- 8. Editando mediante programación la fuente de Python
- 9. El objeto 'conjunto' de Python no admite la indexación
- 10. Programación web Python
- 11. Programación asincrónica en Python Twisted
- 12. ¿Programación estructurada y generadores Python?
- 13. Programación con hardware en python
- 14. Programación Relacional/Lógica en Python?
- 15. Cómo averiguar mediante programación si una instancia del servidor web admite la reescritura url
- 16. ¿Admite Lua los decoradores?
- 17. ¿Admite JavaScript la aplicación de función parcial?
- 18. ¿Admite Android la memoria virtual
- 19. ¿Admite iOS la compresión TLS?
- 20. ¿Silverlight admite la comunicación remota?
- 21. ¿Coldfusion admite argumentos dinámicos?
- 22. ¿El módulo de Python admite límites de palabra (\ b)?
- 23. ¿Admite argparse (python) grupos de argumentos mutuamente excluyentes?
- 24. Analizador de configuración de Python que admite herencia de sección?
- 25. ¿Admite python 3.1.3 unicode en el módulo csv?
- 26. Paquete Python que admite el cómputo de covarianza ponderado
- 27. ¿Controlar la prioridad de programación de subprocesos de python?
- 28. Enviar imagen utilizando la programación de socket Python
- 29. Biblioteca de Python para la programación de trabajos, ssh
- 30. ¿Qué bibliotecas debo usar para la programación lineal en python?
C# no es la corriente principal? –
Global Interpreter Lock también es solo un problema de CPython: Jython e IronPython usan el sistema de subprocesamiento de su tiempo de ejecución, respectivamente. – VolkA
Sin embargo, Jython es más lento que CPython. IronPython es igual de rápido. – Blaisorblade