Программирование Канал

Канал — модель межпроцессного взаимодействия и синхронизации через передачу сообщений в программировании.

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

Каналы являются основополагающими для подхода исчисления процессов и появились в взаимодействующих последовательных процессах (CSP), формальной модели параллелизма. Каналы используются во многих производных языках программирования, таких как Occam, Limbo (через языки Newsqueak и Алеф). Они также используются в потоковой библиотеке libthread языка программирования Си в ОС Plan 9, а также в Stackless Python и языке Go.

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

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

  • Создание канала фиксированного или переменного размера, функция возвращает ссылку или handle
    Channel* chancreate(int elemsize, int bufsize) 
  • Отправка в канал
    int chansend(Channel *c, void *v) 
  • Получение из канала
    int chanrecv(Channel *c, void *v) 

Каналы libthread

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

События OCaml

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

Примеры

XMOS XC

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

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

chan c; int x; par {   c <: 42;   c :> x; } 

Язык Go

Этот фрагмент кода Go сначала создает канал c, затем порождает goroutine, которая посылает 42 через канал. Когда число отправлено в канал, переменная x получит значение 42. Go позволяет каналам буферизировать содержимое. Возможна неблокирующая операция получения из канала с помощью блока select.

c := make(chan int)  go func() {c <- 42}()  x := <- c 

Применения

В дополнение к использованию для межпоточного взаимодействия, каналы могут использоваться как примитив для реализации иных конкурентных конструкций. Например, каналы позволяют реализовать futures and promises, где future является одноэлементным каналом, а promise — процесс, который отправляет в канал, исполняя future. Сходным образом можно реализовать iterators через каналы.

Примечания

Ссылки

Tags:

Программирование Канал Реализации каналовПрограммирование Канал ПримерыПрограммирование Канал ПримененияПрограммирование Канал ПримечанияПрограммирование Канал СсылкиПрограммирование КаналМежпроцессное взаимодействиеОбмен сообщениямиПоток данныхСверка часовСсылка (программирование)

🔥 Trending searches on Wiki Русский:

СлизевикиЛондонМаша и МедведьДамер, ДжеффриСудебная реформа в ИзраилеШазам! Ярость боговПираты Карибского моря (серия фильмов)Блок, Александр АлександровичУкраинский языкAndroidНАТОГеббельс, ЙозефСаддам ХусейнВторжение России на Украину (с 2022)Аксёнова, Любовь ПавловнаЧерномырдин, Виктор СтепановичНетаньяху, БиньяминКарим, ДжаведБетховен, Людвиг ванШотландияРеспублика КореяСписок городов РоссииСербияФомин, Олег БорисовичТарантино, КвентинТ-62ВоронежВеликолепный векЧВК «Вагнер»Тухель, ТомасАлександр IХэнкс, ТомСодержанки (сериал)БалкенкройцСВОЛиванНационал-социализмСиндром АспергераThe Last of Us Part IIСССоциальная сетьЗемляДжон Уик (персонаж)КорьГрань (управляемая мина)Александр Ярославич НевскийСписок умерших в 2023 годуКрымСвященная Римская империяАвтомат КалашниковаЕлизавета IIШемякина, Доротея МихайловнаАфганская война (1979—1989)Лоуренс, ДженниферСШАКошечкин, Василий ВладимировичВладивостокШумахер, МихаэльТы (телесериал)Флаг РоссииЛебедев, Артемий АндреевичУкраинаТерешкова, Валентина ВладимировнаВладимиров, Игорь ПетровичАрестович, Алексей НиколаевичЯнковский, Олег ИвановичКнязев, Андрей СергеевичСолдаты (телесериал)Рейс 370 Malaysia AirlinesАварийная посадка A321 под ЖуковскимТор (зенитный ракетный комплекс)Дупак, Николай ЛукьяновичЧерчилль, УинстонСаудовская АравияGoogle (компания)ЭкзистенциализмМиГ-31Иван Грозный🡆 More