Jump to content

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

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

каналы 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]
  • Для С++:
    • плита [8] Эта реализация поддерживает разбиение, а также различные операции слияния и сжатия. К отдельным узлам могут быть прикреплены разные исполнители.

Ссылки [ править ]

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

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 58b39f60cd8a372d2e26246a55ecee34__1716055440
URL1:https://arc.ask3.ru/arc/aa/58/34/58b39f60cd8a372d2e26246a55ecee34.html
Заголовок, (Title) документа по адресу, URL1:
Channel (programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)