Лекция
Привет, Вы узнаете о том , что такое сопрограмма, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое сопрограмма, coroutine, корутины , настоятельно рекомендую прочитать все из категории Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы.
сопрограмма (англ. coroutine) — программный модуль, особым образом организованный для обеспечения взаимодействия с другими модулями по принципу кооперативной многозадачности: модуль приостанавливается в определенной точке, сохраняя полное состояние (включая стек вызовов и счетчик команд), и передает управление другому, тот, в свою очередь, выполняет задачу и передает управление обратно, сохраняя свои стек и счетчик. Наряду с фиберами (англ. fiber), сопрограммы являются средством обеспечения «легковесной» программной многопоточности в том смысле, что могут быть реализованы без использования механизмов переключений контекста операционной системой.
Сопрограммы являются более гибкими и обобщенными, чем подпрограммы: в сравнении с подпрограммой, имеющей всегда одну входную точку, сопрограмма имеет стартовую точку входа, за которой внутри размещены последовательность возвратов; каждый возврат также наделяется своей точкой входа. Подпрограмма может возвращаться только однажды, сопрограмма может возвращать управление несколько раз. Время работы подпрограммы определяется принципом LIFO (последняя вызванная подпрограмма завершается первой), тогда как время работы сопрограммы определяется необходимостью ее запуска.
Появление понятия сопрограммы относят к конструкции, примененной Мелвином Конвеем в 1958 году в практике программирования на языке ассемблера , в 1960-е — 1970-е годы сопрограммы практиковались в некоторых высокоуровневых языках (Клу, Симула, Модула-2), но заметное распространение получили лишь в 2000-е годы, когда в популярных языках программирования появились многочисленные библиотеки поддержки сопрограмм. В некоторые новые языки (такие как Lua, Ruby, Go, Julia) библиотеки поддержки сопрограмм встроены уже изначально. Сопрограммы используются для реализации многих похожих компонентов программ, таких как генераторы и итераторы, бесконечные списки с использованием ленивых вычислений, каналы, конечные автоматы внутри одной подпрограммы (где состояние определяется по текущей точке входа и выхода), реализации обработки исключений и модели акторов.
Сопрограммы полезны для реализации следующего:
Значительная часть популярных языков программирования, включая Си и производные (C++ до версии C++20), не имеют прямой поддержки сопрограмм в языке или стандартной библиотеке (это обусловлено, большей частью, требованиями к стековой реализации подпрограмм).
В ситуации, когда сопрограммы, как естественный способ реализации компонентов, недоступны, типичным решением является создание сопрограмм с использованием набора булевских флагов и других состояний переменных для поддержки внешнего состояния между вызовами. Условия внутри кода приводят к выполнению различных последовательностей команд при последовательных вызовах в соответствии со значениями переменных состояния. Другим типичным решением является самостоятельная реализация конечного автомата с помощью большой инструкции switch. Такие реализации являются сложными для поддержки и сопровождения.
Потоки являются подходящей альтернативой для сопрограмм в большинстве современных разработок. Потоки предоставляют возможности для управления взаимодействием «одновременно» выполняющихся участков кода. Поэтому это решение больших и сложных проблем, оно включает мощные комплексные возможности и имеет сопутствующую сложность для обучения. Однако, несмотря на другие альтернативы, потоки широко доступны в окружении Си, являются близкими для большинства программистов, и обычно реализованы, документированы и сопровождаются.
Некоторые попытки реализовать сопрограммы на Си:
Один из используемых подходов реализации сопрограмм в языках без их встроенной поддержки — не использующие стек протопотоки, обеспечивающие блокирующий контекст ценой расхода нескольких байтов памяти на один поток.
Функциональные языки программирования зачастую реализуют сопрограммы, например, Scheme, Лисп, Haskell. В ряд языков встроенная поддержка сопрограмм добавлена в последующих реализациях, таковы, например, Python (начиная с 2.5 и с явной синтаксической поддержкой, начиная с 3.5), PHP (начиная с 5.5), Kotlin (с версии 1.1), JavaScript (с версии 1.7), C# (с версии 2.0), Tcl (с версии 8.6).
Сопрограммы
Сопрограммы являются более обобщенными, чем подпрограммы. Отличительной особенностью сопрограмм является наличие нескольких точек входа, как изображено на рисунке 5. Подпрограмма имеет всегда одну входную точку, сопрограмма имеет стартовую точку входа и размещенные внутри последовательность возвратов и следующих за ними точек входа. Подпрограмма может возвращаться только однажды, сопрограмма может возвращать управление несколько раз. После повторного вызова подпрограммы, выполнение начнется со стартовой точки входа, а в сопрограмме с места в котором было передано управление.
Рисунок 5 - Отличительные особенности сопрограммы от подпрограммы.
Благодаря сопрограммам код выглядит так, как будто выполняется в одном потоке выполнения. Вследствие этого повышается легкость написания программ, легкость поддержки и отлова ошибок. Стоит заметить, что на создание и на управление сопрограммам тратится процессорное время поэтому производительность на 10%-15% меньше, чем у чисто асинхронного подхода .
Существуют две различных реализации сопрограмм:
StackFull является более производительной реализацией сопрограмм, но так же и самой сложной. Данная реализация существует лишь в библиотеках Boost.Coroutine, Boost.Context языка C++. Остальные языки программирования используют StackLess реализацию.
Эффективное использование асинхронных операций
Асинхронные операции являются самым эффективным методом повышения производительности диспетчерского центра, который большую часть времени работает с операциями ввода-вывода. Этот метод опробован мной на проекте диспетчерского центра системы высокоточного позиционирования объектов. Количество клиентов, запросы которых обрабатывает сервер, возросло на 40%. Это очень существенный прирост производительности при минимальных трудозатратах. В это внес свой вклад правильный выбор языка программирования. В данном случае это C#, который в своей пятой версии получил поддержку асинхронных операций с помощью сопрограмм.
Исследование, описанное в статье про сопрограмма, подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое сопрограмма, coroutine, корутины и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы
Из статьи мы узнали кратко, но содержательно про сопрограмма
Комментарии
Оставить комментарий
Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы
Термины: Высоконагруженные проекты.Паралельные вычисления. Суперкомпьютеры. Распределенные системы