Canal (programación)

Un canal  es un modelo para la comunicación y sincronización entre procesos a través del paso de mensajes en la programación. Los mensajes se pueden enviar a través de un canal, y otro proceso o subproceso que tenga un enlace al canal puede recibir una secuencia de mensajes enviados a través del canal como una secuencia . Las diferentes implementaciones de canales pueden ser sincrónicas o asincrónicas, usar almacenamiento en búfer de mensajes o no.

Los canales son fundamentales para el enfoque de cálculo de procesos y se originaron en los procesos secuenciales cooperativos (CSP), un modelo formal de concurrencia. Los canales se utilizan en muchos lenguajes de programación derivados, como Occam , Limbo (a través de los lenguajes Newsqueak y Aleph ). También se utilizan en la biblioteca de subprocesos libthread del lenguaje de programación C en el sistema operativo Plan 9 , así como en Stackless Python y el lenguaje Go .

Implementaciones de canales

Los canales, creados de manera similar al modelo CSP, son síncronos : un proceso que espera recibir un objeto de un canal se bloquea hasta que se envía el objeto. Tales implementaciones se denominan "encuentro". Las operaciones típicas en dichas tuberías se presentan utilizando las interfaces de canal libthread como ejemplo:

canales libthread

La biblioteca de subprocesos libthread , creada originalmente para el sistema operativo Plan 9 , ofrece capacidades de comunicación entre subprocesos a través de conductos de tamaño fijo.

Eventos OCaml

El módulo de eventos OCaml implementa canales tipificados para la sincronización. Cuando se llaman las funciones de envío y recepción del módulo, generan eventos correspondientes que se pueden sincronizar.

Ejemplos

XMOS XC

En XMOS , el lenguaje XC proporciona un tipo integrado "chan" y dos operadores "<:" y ":>" para enviar y recibir datos de un canal. [una]

El ejemplo inicia dos subprocesos de hardware en XMOS, ejecutando dos líneas desde el bloque "par". La primera línea envía el número 42 a través de la tubería. La segunda línea espera que se reciba un valor del canal y escribe el valor recibido en la variable x. El lenguaje XC también admite la recepción asíncrona de canales que utilizan la declaración de selección.

chanc ; _ intx ; _ par { c <: 42 ; c :> x ; }

El lenguaje Go

Esta pieza de código Go primero crea el canal c, luego genera una rutina go que envía 42 a través del canal. Cuando se envía un número a un canal, x se establecerá en 42. Go permite que los canales almacenen el contenido en el búfer. Una operación de recepción sin bloqueo desde un canal es posible utilizando un bloque de selección. [2]

c := hacer ( chan int ) ir func () { c <- 42 }() x := <- c

Aplicaciones

Además de usarse para la comunicación entre subprocesos, los canales se pueden usar como una primitiva para implementar otras construcciones concurrentes. Por ejemplo, los canales le permiten implementar futuros y promesas , donde el futuro es un canal único y la promesa es un proceso que envía al canal, ejecutando el futuro. [3] Del mismo modo, los iteradores se pueden implementar a través de tuberías. [cuatro]

Notas

  1. Guía de programación XMOS (enlace no disponible) . Consultado el 4 de agosto de 2016. Archivado desde el original el 4 de marzo de 2016. 
  2. Go eficaz: el lenguaje de programación Go . Consultado el 4 de agosto de 2016. Archivado desde el original el 6 de enero de 2015.
  3. " Futures Archivado el 4 de diciembre de 2020 en Wayback Machine ", Go Language Patterns Archivado el 11 de noviembre de 2020 en Wayback Machine
  4. " Iteradores archivado el 15 de octubre de 2020 en Wayback Machine ", Go Language Patterns archivado el 11 de noviembre de 2020 en Wayback Machine

Enlaces