Simultaneidad estructurada - Structured concurrency
La concurrencia estructurada es un paradigma de programación destinado a mejorar la claridad, la calidad y el tiempo de desarrollo de un programa informático mediante el uso de un enfoque estructurado para la programación concurrente .
El concepto central es la encapsulación de subprocesos de ejecución concurrentes (que aquí abarcan los subprocesos y procesos del kernel y del área de usuario) mediante construcciones de flujo de control que tienen puntos de entrada y salida claros y que garantizan que todos los subprocesos generados se hayan completado antes de la salida. Tal encapsulación permite que los errores en subprocesos concurrentes se propaguen al alcance principal de la estructura de control y se administren mediante los mecanismos nativos de manejo de errores de cada lenguaje informático en particular. Permite que el flujo de control siga siendo evidente por la estructura del código fuente a pesar de la presencia de concurrencia. Para que sea eficaz, este modelo debe aplicarse de forma coherente en todos los niveles del programa; de lo contrario, los subprocesos simultáneos pueden filtrarse, quedar huérfanos o no propagar correctamente los errores de tiempo de ejecución.
La concurrencia estructurada es análoga a la programación estructurada , que introdujo construcciones de flujo de control que encapsulaban sentencias y subrutinas secuenciales.
Historia
El modelo fork-join de la década de 1960, incorporado por herramientas de multiprocesamiento como OpenMP , es un ejemplo temprano de un sistema que garantiza que todos los subprocesos se hayan completado antes de la salida. Sin embargo, Smith sostiene que este modelo no es una verdadera concurrencia estructurada, ya que el lenguaje de programación desconoce el comportamiento de unión y, por lo tanto, no puede aplicar la seguridad.
El concepto fue formulado en 2016 por Martin Sústrik (creador de ZeroMQ ) con su biblioteca C libdill, con goroutines como punto de partida. Nathaniel J. Smith lo perfeccionó aún más en 2018, quien introdujo un "patrón de guardería" en su implementación de Python llamado Trio. Mientras tanto, Roman Elizarov, de forma independiente, encontró las mismas ideas mientras desarrollaba una biblioteca de corrutinas experimental para el idioma Kotlin .
En 2019, el proyecto de telar de OpenJDK está adoptando la concurrencia estructurada para llevarlo a la plataforma Java en una versión futura como parte de un trabajo más amplio sobre subprocesos ligeros y corrutinas .
En 2021, Swift adoptó la concurrencia estructurada.
Variaciones
Un punto importante de variación es cómo se maneja un error en un miembro de un árbol de subprocesos concurrentes. Las implementaciones simples simplemente esperarán hasta que los hijos y los hermanos del subproceso fallido se completen antes de propagar el error al ámbito principal. Sin embargo, eso podría llevar una cantidad de tiempo indefinida. La alternativa es emplear un mecanismo de cancelación general (típicamente un esquema cooperativo que permite que se respeten los invariantes del programa) para terminar los hilos de hijos y hermanos de una manera conveniente.
Ver también
Referencias
Citas
enlaces externos
- Concurrencia estructurada , Alan Bateman, OpenJDK wiki
- Foro de concurrencia estructurada , discusión entre lenguajes de computadora sobre concurrencia estructurada con la participación de Sústrik, Smith y Elizarov
- FOSDEM 2019: Concurrencia estructurada , charla relámpago de Martin Sustrik con enlaces a algunas implementaciones