En informática, un canal es un modelo para la 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 referencia , como una secuencia . Diferentes implementaciones de canales pueden tener buffer o no, y ser síncronas o asíncronas.
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 escritos para sincronización. Cuando se llaman las funciones de envío y recepción del módulo, crean eventos de envío y recepción correspondientes que se pueden sincronizar.
La biblioteca Love2D , que forma parte del 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. threadCode local = [[ love.thread.getChannel("test"):push("¡Hola mundo!") ]]función amor . load () - Inicia el hilo. hilo = amor . hilo . hilo nuevo ( código de hilo ) : inicio () -- El hilo se bloqueará hasta "¡Hola mundo!" sale de la pila de prueba del canal. -- Debido a que el canal se puede extraer antes de que se ejecute el subproceso 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 . getChannel ( "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 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 la segunda espera hasta recibirlo y establece el valor de x. El lenguaje XC también permite la recepción asincrónica en canales a través de una declaración de selección.
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 rutina que envía 42 a través del canal. Cuando el número se ingresa en el canal, x se establece en 42. Go permite que los canales almacenen contenidos en buffer, así como también la recepción sin bloqueo mediante el uso de un bloque de selección. [2]
c := hacer ( chan 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 :: sincronización :: mpsc ; utilizar std :: hilo ; fn main () { let ( tx , rx ) = mpsc :: canal (); hilo :: spawn ( mover || { tx . enviar ( 123 ). desenvolver (); }); sea resultado = rx . recv (); imprimir! ( "{:?}" , resultado ); }
Además de su uso fundamental para la comunicación entre procesos, los canales se pueden utilizar como primitivos para implementar otras construcciones de programación concurrentes 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]