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

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

Каналы имеют фундаментальное значение для процесс исчисления подход к параллелизму и возник в связь последовательных процессов (CSP), формальная модель параллелизма, которая использовалась во многих производных языках, таких как Оккам, и Язык программирования Limbo (через Newsqueak и Язык программирования алеф ). Они также используются в План 9 от Bell Labs libthread, а также в Безстековый Python и Язык программирования Go.

Реализации каналов

Каналы, смоделированные по модели CSP, по своей сути синхронный: процесс, ожидающий получения объекта из канала, будет блокировать пока объект не будет отправлен. Это также называется рандеву поведение. Типичные поддерживаемые операции представлены ниже на примере libthread канал API.

  • Создание канала фиксированного или переменного размера, возвращающее ссылка или же ручка
    Канал* Chancreate(int Elemsize, int bufsize)
  • отправка на канал
    int Chansend(Канал *c, пустота *v)
  • получение с канала
    int Chanrecv(Канал *c, пустота *v)

каналы libthread

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

OCaml события

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

Примеры

XMOS XC

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

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

чан c;int Икс;номинал {  c <: 42;  c :> Икс;}

Идти

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

c := делать(чан int)идти func() {c <- 42}()Икс := <- c

Приложения

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

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

  1. ^ «Архивная копия». Архивировано из оригинал на 2016-03-04. Получено 2015-05-10.CS1 maint: заархивированная копия как заголовок (связь)
  2. ^ https://golang.org/doc/effective_go.html#channels
  3. ^ "Фьючерсы ", Языковые шаблоны Go
  4. ^ "Итераторы ", Языковые шаблоны Go

внешняя ссылка