stringtranslate.com

Canal (programación)

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.

canales de libthread

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.

Eventos de OCaml

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.

Ejemplos

Lua Love2D

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

XMOS XC

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 ; }         

Ir

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   

Óxido

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 Sendery 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 ); }     

Aplicaciones

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]

Lista de implementaciones

Referencias

  1. ^ "Guía de programación XMOS | XMOS". Archivado desde el original el 4 de marzo de 2016. Consultado el 10 de mayo de 2015 .
  2. ^ "Go efectivo: el lenguaje de programación Go".
  3. ^ "Canales - Rust con ejemplos". doc.rust-lang.org . Consultado el 28 de noviembre de 2020 .
  4. ^ "Futuros Archivado el 4 de diciembre de 2020 en Wayback Machine ", Patrones del lenguaje Go Archivado el 11 de noviembre de 2020 en Wayback Machine
  5. ^ "Iteradores Archivado el 15 de octubre de 2020 en Wayback Machine ", Patrones del lenguaje Go Archivado el 11 de noviembre de 2020 en Wayback Machine
  6. ^ Sufrin, Bernard (13 de julio de 2021), ThreadCSO (PDF) , consultado el 17 de febrero de 2023
  7. ^ Sufrin, Bernard (13 de julio de 2021), ThreadCSO , consultado el 17 de febrero de 2023
  8. ^ "stlab es el trabajo en curso de lo que fue el Laboratorio de Tecnología de Software de Adobe. Las bibliotecas de código fuente de Adobe (ASL), las bibliotecas de plataforma y las nuevas bibliotecas de stlab están alojadas en github". 2021-01-31.

Enlaces externos