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