Канал (программирование) - 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]
Рекомендации
- ^ «Архивная копия». Архивировано из оригинал на 2016-03-04. Получено 2015-05-10.CS1 maint: заархивированная копия как заголовок (связь)
- ^ https://golang.org/doc/effective_go.html#channels
- ^ "Фьючерсы ", Языковые шаблоны Go
- ^ "Итераторы ", Языковые шаблоны Go