python - programming - julia language online
Paralelismo en Julia. Características y limitaciones (1)
En su artículo arXiv , los autores originales de Julia mencionan lo siguiente:
2.14 Parallelism
. La ejecución paralela es proporcionada por un sistema de multiprocesamiento basado en mensajes implementado en Julia en la biblioteca estándar. El diseño del lenguaje admite la implementación de dichas bibliotecas al proporcionar coroutines simétricos, que también pueden considerarse como subprocesos programados de forma cooperativa. Esta característica permite ocultar la comunicación asíncrona dentro de las bibliotecas, en lugar de requerir que el usuario configure las devoluciones de llamada. Julia actualmente no admite subprocesos nativos, lo cual es una limitación, pero tiene la ventaja de evitar las complejidades del uso sincronizado de la memoria compartida.
¿Qué quieren decir con que Julia no admite subprocesos nativos ? ¿Qué es un hilo nativo?
¿Hay otros lenguajes interpretados, como Python o R, compatibles con este tipo de paralelismo? ¿Está Julia sola en esto?
Los "subprocesos nativos" son contextos de ejecución separados, administrados por el kernel del sistema operativo, acceden a un espacio de memoria compartido y se ejecutan de manera simultánea en núcleos separados. Compare esto con procesos separados, que pueden ejecutarse simultáneamente en múltiples núcleos pero tienen espacios de memoria separados. Asegurarse de que los procesos interactúen bien es fácil, ya que solo pueden comunicarse entre sí a través del núcleo. Asegurarse de que los subprocesos no interactúen de manera impredecible y con errores es muy difícil, ya que pueden leer y escribir en la misma memoria sin restricciones.
La situación de R es bastante sencilla: R no es multihilo . Python es un poco más complicado: Python admite subprocesos, pero debido al bloqueo global del intérprete (GIL) , no es posible la ejecución simultánea real del código de Python. Otros lenguajes dinámicos de código abierto populares están en varios estados mixtos con respecto a los subprocesos nativos (Ruby: no/kinda/yes? Node.js: no ), pero en general, la respuesta es no, no admiten subprocesos nativos totalmente simultáneos. , así que Julia no está sola en esto.
Cuando agreguemos un paralelismo de memoria compartida a Julia, como planeamos hacerlo , ya sea utilizando subprocesos nativos o múltiples procesos con memoria compartida, será una verdadera concurrencia y no habrá GIL que impida la ejecución simultánea del código Julia. Sin embargo, esta es una característica increíblemente difícil de agregar a un idioma, como lo demuestra el soporte inexistente o limitado en otros lenguajes dinámicos maduros muy populares. Agregar un modelo de concurrencia de memoria compartida es técnicamente difícil, pero el problema real es diseñar un modelo de programación que permita a los programadores hacer un uso efectivo de la concurrencia de hardware de manera productiva y segura. Este problema generalmente no está resuelto y es un área muy activa de investigación y experimentación, no hay un "estándar de oro" para copiar. Podríamos simplemente agregar soporte de subprocesos POSIX, pero ese modelo de programación es generalmente considerado peligroso e increíblemente difícil de usar de manera correcta y efectiva. Go tiene una excelente historia de concurrencia, pero está diseñado para escribir servidores altamente concurrentes, no para operar simultáneamente en datos grandes, por lo que no está nada claro que simplemente copiar el modelo de Go es una buena idea para Julia.