Канал (программирование)
В вычислениях канал — это модель межпроцессного взаимодействия и синхронизации посредством передачи сообщений . Сообщение может быть отправлено по каналу, а другой процесс или поток может получать сообщения, отправленные по каналу, на который он имеет ссылку , в виде потока . Различные реализации каналов могут быть с буферизацией или без нее, а также быть синхронными или асинхронными.
каналы libthread [ править ]
Многопоточная , библиотека libthread впервые созданная для операционной системы Plan 9 , предлагает межпоточную связь на основе каналов фиксированного размера.
События OCaml [ править ]
Модуль событий OCaml предлагает типизированные каналы для синхронизации. Когда вызываются функции отправки и получения модуля, они создают соответствующие события отправки и получения, которые можно синхронизировать.
Примеры [ править ]
Луа Love2D [ править ]
Библиотека Love2D , использующая язык программирования Lua , реализует каналы с операциями push и pop, аналогичными стекам. Операция извлечения будет заблокирована до тех пор, пока в стеке находятся данные. Операция запроса эквивалентна операции pop, за исключением того, что она блокируется до тех пор, пока в стеке не появятся данные.
-- A string containing code which will be interpreted by a function such as loadstring(),
-- but on the C side to start a native thread.
local threadCode = [[
love.thread.getChannel("test"):push("Hello world!")
]]
function love.load()
-- Start the thread.
thread = love.thread.newThread(threadCode)
thread:start()
-- The thread will block until "Hello world!" is popped off channel test's stack.
-- Because the channel can be popped from before the thread first executes, there may not be data on the stack.
-- in that case use :demand() instead of :pop() because :demand() will block until there is data on the stack and then return the data.
print(love.thread.getChannel("test"):demand())
-- The thread can now finish.
end
XMOS XC [ править ]
Язык XMOS программирования XC предоставляет примитивный тип «chan» и два оператора «<:» и «:>» для отправки и получения данных из канала. [1]
В этом примере на XMOS запускаются два аппаратных потока, выполняющие две строки в блоке «par». Первая строка передает по каналу число 42, а вторая ждет его получения и устанавливает значение x. Язык XC также позволяет асинхронный прием по каналам с помощью оператора выбора.
chan c;
int x;
par {
c <: 42;
c :> x;
}
Иди [ править ]
Этот фрагмент кода Go работает аналогично коду XC. Сначала создается канал c, затем запускается горутина, которая отправляет 42 через канал. Когда число помещается в канал, x устанавливается равным 42. Go позволяет каналам буферизировать содержимое, а также неблокировать прием за счет использования блока выбора. [2]
c := make(chan int)
go func() {c <- 42}()
x := <- c
Ржавчина [ править ]
Rust предоставляет асинхронные каналы для связи между потоками. Каналы обеспечивают однонаправленный поток информации между двумя конечными точками: Sender
и Receiver
. [3]
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
tx.send(123).unwrap();
});
let result = rx.recv();
println!("{:?}", result);
}
Приложения [ править ]
В дополнение к их фундаментальному использованию для межпроцессного взаимодействия, каналы могут использоваться в качестве примитива для реализации различных других конструкций параллельного программирования, которые могут быть реализованы в виде потоков. Например, каналы можно использовать для построения фьючерсов и промисов , где фьючерс — это одноэлементный канал, а промис — это процесс, который отправляет данные в канал, выполняя будущее. [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 г.