В вычислительной технике канал — это модель для межпроцессного взаимодействия и синхронизации посредством передачи сообщений . Сообщение может быть отправлено по каналу, а другой процесс или поток может получать сообщения, отправленные по каналу, на который у него есть ссылка , как поток . Различные реализации каналов могут быть буферизованными или нет, а также синхронными или асинхронными.
Многопоточная библиотека libthread, впервые созданная для операционной системы Plan 9 , обеспечивает межпотоковое взаимодействие на основе каналов фиксированного размера.
Модуль событий OCaml предлагает типизированные каналы для синхронизации. Когда вызываются функции отправки и получения модуля, они создают соответствующие события отправки и получения, которые можно синхронизировать.
Библиотека Love2D , использующая язык программирования Lua , реализует каналы с операциями push и pop, похожими на стеки. Операция pop будет блокироваться, пока в стеке есть данные. Операция demand эквивалентна pop, за исключением того, что она будет блокироваться, пока в стеке есть данные
-- Строка, содержащая код, который будет интерпретироваться функцией, например loadstring(), -- но на стороне C для запуска собственного потока.local threadCode = [[ love.thread.getChannel("test"):push("Привет, мир!") ]]function love.load () — Начать поток. thread = love.thread.newThread ( threadCode ) thread : start ( ) -- Поток будет заблокирован до тех пор, пока "Hello world!" не будет извлечен из стека теста канала. -- Поскольку канал может быть извлечен до того, как поток впервые выполнится, в стеке может не быть данных. -- В этом случае используйте :demand() вместо :pop(), поскольку :demand() будет заблокирован до тех пор, пока в стеке не появятся данные, а затем вернет данные. печать ( любовь . поток . getChannel ( "тест" ): спрос ()) -- Теперь поток можно завершить. конец
Язык программирования XMOS XC предоставляет примитивный тип «Chan» и два оператора «<:» и «:>» для отправки и получения данных из канала. [1]
В этом примере на XMOS запускаются два аппаратных потока, запускающих две строки в блоке "par". Первая строка передает число 42 по каналу, а вторая ждет его получения и устанавливает значение x. Язык XC также допускает асинхронный прием по каналам через оператор select.
чан с ; интервал х ; пар { с <: 42 ; с :> х ; }
Этот фрагмент кода Go работает аналогично коду XC. Сначала создается канал c, затем порождается goroutine, которая отправляет 42 через канал. Когда число помещается в канал x, он устанавливается в 42. Go позволяет каналам буферизировать содержимое, а также неблокируемый прием с помощью блока select. [2]
c := make ( чан инт ) перейти функция () { 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.recv (); println ! ( "{:?}" , результат ) ; }
В дополнение к их фундаментальному использованию для межпроцессного взаимодействия, каналы могут использоваться как примитив для реализации различных других параллельных программных конструкций, которые могут быть реализованы как потоки. Например, каналы могут использоваться для построения futures и promises , где future — это одноэлементный канал, а promise — это процесс, который отправляет в канал, выполняя future. [4] Аналогично, итераторы могут быть построены непосредственно из каналов. [5]