En informática, un canal es un modelo de comunicación y sincronización entre procesos mediante el paso de mensajes . Se puede enviar un mensaje a través de un canal y otro proceso o subproceso puede recibir mensajes enviados a través de un canal al que tiene una referencia , como un flujo . Las diferentes implementaciones de canales pueden tener o no almacenamiento en búfer, y ser sincrónicas o asincrónicas.
La biblioteca multiproceso , libthread, que se creó por primera vez para el sistema operativo Plan 9 , ofrece comunicación entre subprocesos basada en canales de tamaño fijo.
El módulo de eventos OCaml ofrece canales tipificados para la sincronización. Cuando se invocan las funciones de envío y recepción del módulo, se crean eventos de envío y recepción correspondientes que se pueden sincronizar.
La biblioteca Love2D , que utiliza el lenguaje de programación Lua , implementa canales con operaciones push y pop similares a las pilas. La operación pop se bloqueará siempre que haya datos residentes en la pila. Una operación de demanda es equivalente a pop, excepto que se bloqueará hasta que haya datos en la pila.
-- Una cadena que contiene código que será interpretado por una función como loadstring(), -- pero en el lado C para iniciar un hilo nativo. hilo localCode = [[ love.thread.getChannel("test"):push("¡Hola mundo!") ]]función amor .load () – Iniciar el hilo. hilo = amor . hilo . nuevoHilo ( hiloCode ) hilo : inicio () -- El hilo se bloqueará hasta que "¡Hola mundo!" se extraiga de la pila del canal de prueba. -- Debido a que el canal se puede extraer antes de que el hilo se ejecute por primera vez, es posible que no haya datos en la pila. -- en ese caso, use :demand() en lugar de :pop() porque :demand() se bloqueará hasta que haya datos en la pila y luego devolverá los datos. imprimir ( amor . hilo . obtenerCanal ( "prueba" ): demanda ()) -- El hilo ya puede terminar. fin
El lenguaje de programación XMOS XC proporciona un tipo primitivo "Chan" y dos operadores "<:" y ">" para enviar y recibir datos de un canal. [1]
En este ejemplo, se inician dos subprocesos de hardware en el XMOS, ejecutando las dos líneas en el bloque "par". La primera línea transmite el número 42 a través del canal mientras que la segunda espera hasta que se reciba y establece el valor de x. El lenguaje XC también permite la recepción asincrónica en canales a través de una instrucción select.
chanc ; intx ; par { c <: 42 ; c :> x ; }
Este fragmento de código Go funciona de manera similar al código XC. Primero se crea el canal c, luego se genera una goroutine que envía 42 a través del canal. Cuando se ingresa el número en el canal x se establece en 42. Go permite que los canales almacenen contenido en búfer, así como la recepción sin bloqueo mediante el uso de un bloque de selección. [2]
c := hacer ( canal int ) ir func () { c <- 42 }() x := <- c
Rust proporciona canales asincrónicos para la comunicación entre subprocesos. Los canales permiten un flujo unidireccional de información entre dos puntos finales: el Sender
y el Receiver
. [3]
utilizar std :: sync :: mpsc ; utilizar std :: hilo ; fn main () { let ( tx , rx ) = mpsc :: canal (); hilo :: generar ( mover || { tx.send ( 123 ) .unwrap ( ); } ); deje que resultado = rx . recv (); println! ( "{:?}" , resultado ); }
Además de su uso fundamental para la comunicación entre procesos, los canales se pueden utilizar como un primitivo para implementar varias otras construcciones de programación concurrente que se pueden realizar como flujos. Por ejemplo, los canales se pueden utilizar para construir futuros y promesas , donde un futuro es un canal de un elemento y una promesa es un proceso que envía al canal, cumpliendo el futuro. [4] De manera similar, los iteradores se pueden construir directamente a partir de canales. [5]