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 .
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:
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.
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.
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 ; }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 := <- cAdemá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]