stringtranslate.com

Canal (programación)

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.


canales 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 OCaml

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.

Ejemplos

Lua Love2D

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

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

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

Ó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 :: 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 ); }     

Aplicaciones

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]

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. ^ "Effective Go: el lenguaje de programación Go".
  3. ^ "Canales: óxido con el ejemplo". doc.rust-lang.org . Consultado el 28 de noviembre de 2020 .
  4. ^ "Futuros Archivado el 4 de diciembre de 2020 en Wayback Machine ", Go Language Patterns Archivado el 11 de noviembre de 2020 en Wayback Machine.
  5. ^ " Iteradores Archivado el 15 de octubre de 2020 en Wayback Machine ", Go Language Patterns 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 era el Laboratorio de tecnología de software de Adobe. Las bibliotecas fuente de Adobe (ASL), las bibliotecas de plataforma y las nuevas bibliotecas stlab están alojadas en github". 2021-01-31.

enlaces externos