Канал (программирование)
В вычислениях канал — это модель межпроцессного взаимодействия и синхронизации посредством передачи сообщений . Сообщение может быть отправлено по каналу, а другой процесс или поток может получать сообщения, отправленные по каналу, на который он имеет ссылку , в виде потока . Различные реализации каналов могут быть с буферизацией или без нее, а также быть синхронными или асинхронными.
каналы libthread [ править ]
Многопоточная libthread библиотека , впервые созданная для операционной системы Plan 9 , предлагает межпоточную связь на основе каналов фиксированного размера.
События OCaml [ править ]
Модуль событий OCaml предлагает типизированные каналы для синхронизации. Когда вызываются функции отправки и получения модуля, они создают соответствующие события отправки и получения, которые можно синхронизировать.
Примеры [ править ]
Луа Love2D [ править ]
Библиотека Love2D , использующая язык программирования Lua , реализует каналы с операциями push и pop, аналогичными стекам. Операция извлечения будет заблокирована до тех пор, пока в стеке находятся данные. Операция запроса эквивалентна операции pop, за исключением того, что она блокируется до тех пор, пока в стеке не появятся данные.
-- Строка, содержащая код, который будет интерпретироваться такой функцией, как loadstring(),
-- но на стороне C для запуска собственного потока.
local threadCode = [[
love.thread.getChannel("test"):push("Hello world!")
]]
function love . load ()
-- Запускаем поток.
нить = любовь . нить . newThread ( threadCode )
thread : start ()
— поток будет заблокирован до тех пор, пока не будет получено сообщение «Hello world!» извлекается из стека теста канала.
-- Поскольку канал может быть извлечен до первого выполнения потока, в стеке может не оказаться данных.
-- в этом случае используйте :demand() вместо :pop(), потому что :demand() будет блокироваться до тех пор, пока в стеке не появятся данные, а затем вернет данные.
print ( love . thread . getChannel ( «test» )): требование ())
— Теперь поток может завершиться.
конец
XMOS XC [ править ]
Язык XMOS программирования XC предоставляет примитивный тип «chan» и два оператора «<:» и «:>» для отправки и получения данных из канала. [1]
В этом примере на XMOS запускаются два аппаратных потока, выполняющие две строки в блоке «par». Первая строка передает по каналу число 42, а вторая ждет его получения и устанавливает значение x. Язык XC также позволяет асинхронный прием по каналам с помощью оператора выбора.
чан с ;
ты х ;
пара {
c <: 42 ;
с :> х ;
}
Иди [ править ]
Этот фрагмент кода Go работает аналогично коду XC. Сначала создается канал c, затем запускается горутина, которая отправляет 42 через канал. Когда число помещается в канал, x устанавливается равным 42. Go позволяет каналам буферизировать содержимое, а также неблокировать прием за счет использования блока выбора. [2]
c := make ( chan int )
go func () { c <- 42 }()
x := <- c
Ржавчина [ править ]
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]
Список реализаций [ править ]
- Список нестандартных реализаций каналов на основе библиотек
- Для Скалы:
- CSO — взаимодействие объектов Scala [6] представляет собой полноценный DSL для канальной связи и параллельного выполнения, чьи семантические примитивы являются обобщением примитивов OCCAM. CSO используется с 2007 года при преподавании параллельного программирования, и соответствующие лекции можно найти в реализации ThreadCSO. [7]
- Для С++:
Ссылки [ править ]
- ^ «Руководство по программированию XMOS | XMOS» . Архивировано из оригинала 4 марта 2016 г. Проверено 10 мая 2015 г.
- ^ «Эффективный Go — язык программирования Go» .
- ^ «Каналы — ржавчина на примере» . doc.rust-lang.org . Проверено 28 ноября 2020 г.
- ^ « Фьючерсы , заархивированные 4 декабря 2020 г. в Wayback Machine », Языковые шаблоны Go, заархивированные 11 ноября 2020 г. в Wayback Machine.
- ^ « Итераторы , заархивированные 15 октября 2020 г. в Wayback Machine », Шаблоны языка Go , заархивированные 11 ноября 2020 г. в Wayback Machine.
- ^ Суфрин, Бернард (13 июля 2021 г.), ThreadCSO (PDF) , получено 17 февраля 2023 г.
- ^ Суфрин, Бернард (13 июля 2021 г.), ThreadCSO , получено 17 февраля 2023 г.
- ^ «stlab — это продолжающаяся работа того, что раньше называлось Лабораторией программных технологий Adobe. Библиотеки исходного кода Adobe (ASL), библиотеки платформ и новые библиотеки stlab размещены на github» . 31 января 2021 г.