stringtranslate.com

Канал (программирование)

В вычислениях канал — это модель межпроцессного взаимодействия и синхронизации посредством передачи сообщений . Сообщение может быть отправлено по каналу, а другой процесс или поток может получать сообщения, отправленные по каналу, на который он имеет ссылку , в виде потока . Различные реализации каналов могут быть с буферизацией или без нее, а также быть синхронными или асинхронными.


каналы libthread

Многопоточная библиотека libthread, впервые созданная для операционной системы Plan 9 , предлагает межпоточную связь на основе каналов фиксированного размера.

События OCaml

Модуль событий OCaml предлагает типизированные каналы для синхронизации. Когда вызываются функции отправки и получения модуля, они создают соответствующие события отправки и получения, которые можно синхронизировать.

Примеры

Луа Лав2D

Библиотека Love2D , которая является частью языка программирования Lua , реализует каналы с операциями push и pop, похожими на стеки. Операция извлечения будет заблокирована до тех пор, пока в стеке находятся данные. Операция запроса эквивалентна операции pop, за исключением того, что она блокируется до тех пор, пока в стеке не появятся данные.

-- Строка, содержащая код, который будет интерпретироваться такой функцией, как loadstring(), -- но на стороне C для запуска собственного потока.local  threadCode  =  [[  love.thread.getChannel("test"):push("Привет, мир!") ]]функция  любовь . load ()  -- Запускаем поток.  нить  =  любовь . нить . newThread ( threadCode )  поток : начало ()  -- Поток будет заблокирован до тех пор, пока не появится сообщение "Hello world!" извлекается из стека теста канала.  -- Поскольку канал может быть извлечен до первого выполнения потока, в стеке может не оказаться данных.  -- в этом случае используйте :demand() вместо :pop(), потому что :demand() будет блокироваться до тех пор, пока в стеке не появятся данные, а затем вернет данные.  печать ( любовь . нить . getChannel ( «тест» ): спрос ())  -- Теперь поток может завершиться. конец

XMOS XC

Язык программирования XMOS XC предоставляет примитивный тип «chan» и два оператора «<:» и «:>» для отправки и получения данных из канала. [1]

В этом примере на XMOS запускаются два аппаратных потока, выполняющие две строки в блоке «par». Первая строка передает по каналу число 42, а вторая ждет его получения и устанавливает значение x. Язык XC также позволяет асинхронный прием по каналам с помощью оператора выбора.

чан с ; интервал х ; пар { с <: 42 ; с :> х ; }         

Идти

Этот фрагмент кода Go работает аналогично коду XC. Сначала создается канал c, затем запускается горутина, которая отправляет 42 через канал. Когда число помещается в канал, x устанавливается равным 42. Go позволяет каналам буферизировать содержимое, а также неблокировать прием за счет использования блока выбора. [2]

c := make ( chan int )   go func () { c <- 42 }()    х := <- с   

Ржавчина

Rust предоставляет асинхронные каналы для связи между потоками. Каналы обеспечивают однонаправленный поток информации между двумя конечными точками: Senderи Receiver. [3]

используйте std :: sync :: mpsc ; используйте std :: thread ;  fn  main () { let ( tx , rx ) = mpsc :: channel ();       поток :: spawn ( move || { tx . send ( 123 ). unwrap (); });     пусть результат = rx . получение (); распечататьлн! ( "{:?}" , результат ); }     

Приложения

В дополнение к их фундаментальному использованию для межпроцессного взаимодействия, каналы могут использоваться в качестве примитива для реализации различных других конструкций параллельного программирования, которые могут быть реализованы в виде потоков. Например, каналы можно использовать для построения фьючерсов и промисов , где фьючерс — это одноэлементный канал, а промис — это процесс, который отправляет данные в канал, исполняя будущее. [4] Аналогично, итераторы могут быть созданы непосредственно из каналов. [5]

Список реализаций

Рекомендации

  1. ^ «Руководство по программированию XMOS | XMOS» . Архивировано из оригинала 4 марта 2016 г. Проверено 10 мая 2015 г.
  2. ^ «Эффективный Go - язык программирования Go» .
  3. ^ "Каналы - Ржавчина на примере" . doc.rust-lang.org . Проверено 28 ноября 2020 г.
  4. ^ «Фьючерсы, заархивированные 4 декабря 2020 г. в Wayback Machine », Языковые шаблоны Go, заархивированные 11 ноября 2020 г. в Wayback Machine.
  5. ^ «Итераторы, заархивированные 15 октября 2020 г. в Wayback Machine », Шаблоны языка Go, заархивированные 11 ноября 2020 г. в Wayback Machine.
  6. ^ Суфрин, Бернард (13 июля 2021 г.), ThreadCSO (PDF) , получено 17 февраля 2023 г.
  7. ^ Суфрин, Бернард (13 июля 2021 г.), ThreadCSO , получено 17 февраля 2023 г.
  8. ^ «stlab — это постоянная работа лаборатории программных технологий Adobe. Исходные библиотеки Adobe (ASL), библиотеки платформ и новые библиотеки stlab размещены на github». 31 января 2021 г.

Внешние ссылки