Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Сопрограмма ( coroutine) Корутины кратко

Лекция



Привет, Вы узнаете о том , что такое сопрограмма, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое сопрограмма, coroutine, корутины , настоятельно рекомендую прочитать все из категории Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы.

сопрограмма (англ. coroutine) — программный модуль, особым образом организованный для обеспечения взаимодействия с другими модулями по принципу кооперативной многозадачности: модуль приостанавливается в определенной точке, сохраняя полное состояние (включая стек вызовов и счетчик команд), и передает управление другому, тот, в свою очередь, выполняет задачу и передает управление обратно, сохраняя свои стек и счетчик. Наряду с фиберами (англ. fiber), сопрограммы являются средством обеспечения «легковесной» программной многопоточности в том смысле, что могут быть реализованы без использования механизмов переключений контекста операционной системой.

Сопрограммы являются более гибкими и обобщенными, чем подпрограммы: в сравнении с подпрограммой, имеющей всегда одну входную точку, сопрограмма имеет стартовую точку входа, за которой внутри размещены последовательность возвратов; каждый возврат также наделяется своей точкой входа. Подпрограмма может возвращаться только однажды, сопрограмма может возвращать управление несколько раз. Время работы подпрограммы определяется принципом LIFO (последняя вызванная подпрограмма завершается первой), тогда как время работы сопрограммы определяется необходимостью ее запуска.

Сопрограмма (  coroutine)  Корутины

Появление понятия сопрограммы относят к конструкции, примененной Мелвином Конвеем в 1958 году в практике программирования на языке ассемблера , в 1960-е — 1970-е годы сопрограммы практиковались в некоторых высокоуровневых языках (Клу, Симула, Модула-2), но заметное распространение получили лишь в 2000-е годы, когда в популярных языках программирования появились многочисленные библиотеки поддержки сопрограмм. В некоторые новые языки (такие как Lua, Ruby, Go, Julia) библиотеки поддержки сопрограмм встроены уже изначально. Сопрограммы используются для реализации многих похожих компонентов программ, таких как генераторы и итераторы, бесконечные списки с использованием ленивых вычислений, каналы, конечные автоматы внутри одной подпрограммы (где состояние определяется по текущей точке входа и выхода), реализации обработки исключений и модели акторов.

Общее использование

Сопрограммы полезны для реализации следующего:

  • Конечные автоматы внутри одной подпрограммы, где состояние определяется текущей точкой входа/выхода процедуры; это может привести к более читаемому коду по сравнению с использованием goto , а также может быть реализовано посредством взаимной рекурсии с хвостовыми вызовами .
  • Актерская модель параллелизма, например, в видеоиграх . Об этом говорит сайт https://intellect.icu . У каждого актора есть свои процедуры (это опять-таки логически разделяет код), но они добровольно передают управление центральному планировщику, который выполняет их последовательно (это форма совместной многозадачности ).
  • Генераторы , которые полезны для потоков – особенно ввода/вывода – и для общего обхода структур данных.
  • Связь последовательных процессов , где каждый подпроцесс является сопрограммой. Канальные входы/выходы и операции блокировки создают сопрограммы, и планировщик разблокирует их по событиям завершения. Альтернативно, каждый подпроцесс может быть родительским для следующего за ним в конвейере данных (или предшествующего ему, и в этом случае шаблон может быть выражен как вложенные генераторы).
  • Обратная связь, обычно используемая в математическом программном обеспечении, где такая процедура, как решатель, интегральный вычислитель... требует использования процесса для выполнения вычислений, таких как вычисление уравнения или подынтегральной функции.

Реализации

Значительная часть популярных языков программирования, включая Си и производные (C++ до версии C++20), не имеют прямой поддержки сопрограмм в языке или стандартной библиотеке (это обусловлено, большей частью, требованиями к стековой реализации подпрограмм).

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

Потоки являются подходящей альтернативой для сопрограмм в большинстве современных разработок. Потоки предоставляют возможности для управления взаимодействием «одновременно» выполняющихся участков кода. Поэтому это решение больших и сложных проблем, оно включает мощные комплексные возможности и имеет сопутствующую сложность для обучения. Однако, несмотря на другие альтернативы, потоки широко доступны в окружении Си, являются близкими для большинства программистов, и обычно реализованы, документированы и сопровождаются.

Некоторые попытки реализовать сопрограммы на Си:

  • Coroutines от Саймона Тэтхема с применением «устройства Даффа» ;
  • PCL (portable coroutine library) ;
  • Coro ;
  • библиотека Boost.Coroutine из коллекции Boost.

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

Функциональные языки программирования зачастую реализуют сопрограммы, например, Scheme, Лисп, Haskell. В ряд языков встроенная поддержка сопрограмм добавлена в последующих реализациях, таковы, например, Python (начиная с 2.5 и с явной синтаксической поддержкой, начиная с 3.5), PHP (начиная с 5.5), Kotlin (с версии 1.1), JavaScript (с версии 1.7), C# (с версии 2.0), Tcl (с версии 8.6).

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

Сопрограмма (  coroutine)  Корутины
Рисунок 5 - Отличительные особенности сопрограммы от подпрограммы.


Благодаря сопрограммам код выглядит так, как будто выполняется в одном потоке выполнения. Вследствие этого повышается легкость написания программ, легкость поддержки и отлова ошибок. Стоит заметить, что на создание и на управление сопрограммам тратится процессорное время поэтому производительность на 10%-15% меньше, чем у чисто асинхронного подхода .
Существуют две различных реализации сопрограмм:

  1. StackLess реализация, которая, по сути, представляет собой конечный автомат, хранящий в себе нужные локальные переменные и точки входа. Конструкция Async/await языка C# 5-ой версии реализована именно так [10].
  2. StackFull реализация работает через сохранение/восстановление всех регистров процессора и стека соответственно — по сути, как у настоящих потоков, только это все без обращения к ОС, так что практически мгновенно. Эта реализация нашла применение в библиотеке Boost.Coroutine, Boost.Context языка C++ .

StackFull является более производительной реализацией сопрограмм, но так же и самой сложной. Данная реализация существует лишь в библиотеках Boost.Coroutine, Boost.Context языка C++. Остальные языки программирования используют StackLess реализацию.
Эффективное использование асинхронных операций
Асинхронные операции являются самым эффективным методом повышения производительности диспетчерского центра, который большую часть времени работает с операциями ввода-вывода. Этот метод опробован мной на проекте диспетчерского центра системы высокоточного позиционирования объектов. Количество клиентов, запросы которых обрабатывает сервер, возросло на 40%. Это очень существенный прирост производительности при минимальных трудозатратах. В это внес свой вклад правильный выбор языка программирования. В данном случае это C#, который в своей пятой версии получил поддержку асинхронных операций с помощью сопрограмм.

Вау!! 😲 Ты еще не читал? Это зря!

  • Асинхронный/ожидание
  • Pipeline — своего рода сопрограмма, используемая для связи между программами
  • Protothreads — облегченная реализация потока без стека, использующая механизм, подобный сопрограмме.

Исследование, описанное в статье про сопрограмма, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое сопрограмма, coroutine, корутины и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы

Из статьи мы узнали кратко, но содержательно про сопрограмма
создано: 2024-02-24
обновлено: 2024-02-24
132265



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы

Термины: Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы