Что такое сопрограмма? - PullRequest
       36

Что такое сопрограмма?

166 голосов
/ 16 февраля 2009

Что такое сопрограмма? Как они связаны с параллелизмом?

Ответы [ 7 ]

120 голосов
/ 16 февраля 2009

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

Хороший пример - выражение yield в Python. Это создает сопрограмму. Когда встречается «yield», текущее состояние функции сохраняется, и управление возвращается вызывающей функции. Вызывающая функция может затем передать выполнение обратно в функцию выдачи, и ее состояние будет восстановлено до точки, где был обнаружен «yield», и выполнение продолжится.

62 голосов
/ 01 июля 2015

С Программирование на Lua , раздел "Coroutines":

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

Итак, дело в том: Сопрограммы "совместны". Даже в многоядерной системе в каждый момент времени работает только одна сопрограмма (но несколько потоков могут работать параллельно). Между сопрограммами нет преимущественных прав: запущенная сопрограмма должна явно отказаться от выполнения.

К «concurrency» можно отнести слайд Роба Пайка :

Параллельность - это композиция независимо выполняемых вычислений.

Таким образом, во время выполнения сопрограммы A он передает управление сопрограмме B. Затем через некоторое время сопрограмма B передает управление обратно сопрограмме A. Поскольку существует зависимость между сопрограммами, и они должны работать в тандеме. Таким образом, две сопрограммы не параллелизм .

23 голосов
/ 07 декабря 2018

Я считаю, что большинство ответов слишком технические, хотя это технический вопрос. Мне было трудно понять процесс сопрограммы. Я вроде получаю это, но тогда я не получаю это в то же время.

Я нашел этот ответ очень полезным:

https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9

Цитата от Идана Арье:

Чтобы развить вашу историю, я бы сказал, что-то вроде этого:

Вы начинаете смотреть мультфильм, но это вступление. Вместо при просмотре вступления вы переключаетесь в игру и входите в онлайн-лобби - но для этого нужно 3 игрока, и только вы и ваша сестра в нем. Вместо ждать, пока другой игрок присоединится к вам, переключиться на домашнюю работу, и ответь на первый вопрос Второй вопрос имеет ссылку на YouTube видео нужно смотреть. Вы открываете его - и он начинает загружаться. Вместо ожидания его загрузки, вы переключаетесь обратно на мультфильм. Вступление закончилась, так что вы можете смотреть. Сейчас есть рекламные ролики - но пока что третий игрок присоединился, так что вы переключаетесь на игру и так далее ...

Идея в том, что вы не просто переключаете задачи очень быстро, чтобы сделать похоже, что вы делаете все сразу. Вы используете время Вы ожидаете, что что-то случится (IO), чтобы сделать другие вещи, которые делают требуют вашего непосредственного внимания.

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

11 голосов
/ 21 июня 2016

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

9 голосов
/ 07 октября 2017
  • Сопрограммы - это замечательные функции, доступные на языке котлин
  • Сопрограммы - это новый способ написания асинхронных, неблокирующих код (и многое другое)
  • Coroutine - легкие нити. Легкая нить означает, что это не сопоставляется с собственным потоком, поэтому не требует переключения контекста на процессоре, чтобы они были быстрее.
  • это не отображается на нить
  • Сопрограммы и потоки являются многозадачными. Но разница заключается в том, что потоки управляются операционной системой, а сопрограммы - пользователями.

В основном, есть два типа сопрограмм:

  1. Stackless
  2. Stackful

Kotlin реализует сопрограммы без стеков - это означает, что сопрограммы не имеют собственного стека, поэтому они не отображаются в нить.

Это функции для запуска сопрограммы:

launch{}

async{}

Вы можете узнать больше здесь:

https://www.kotlindevelopment.com/deep-dive-coroutines/

https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9

4 голосов
/ 12 апреля 2017

На другой ноте, в Python gevent библиотека - это сетевая библиотека на основе coroutine, которая предоставляет вам нитевидные функции, такие как асинхронные сетевые запросы, без затрат на создание и уничтожение потоков. Используемая библиотека coroutine: greenlet.

0 голосов
/ 31 мая 2019

С Python Coroutine :

Выполнение сопрограмм Python может быть приостановлено и возобновлено во многих очки (см. сопрограмму). Внутри тела функции сопрограммы, ждите и асинхронные идентификаторы становятся зарезервированными ключевыми словами; жду выражения, async for и async with могут использоваться только в функции сопрограммы тел.

С сопрограммы (C ++ 20)

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

Сравните с ответом другого:

На мой взгляд, возобновленная позже часть - это принципиальная разница, как у @ Twinkle.
Хотя многие поля документа все еще находятся в стадии разработки, тем не менее, эта часть похожа на большинство ответов, за исключением @Nan Xiao's

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

Поскольку он цитируется программой на языке Lua, возможно, он связан с языком (в настоящее время не знаком с Lua), не во всех документах упоминается только только одна часть.

Отношение с одновременным:
Существует часть «Выполнение» Сопрограммы (C ++ 20) . Слишком долго, чтобы цитировать здесь.
Помимо деталей, есть несколько состояний.

When a coroutine begins execution  
When a coroutine reaches a suspension point  
When a coroutine reaches the co_return statement  
If the coroutine ends with an uncaught exception  
When the coroutine state is destroyed either because it terminated via co_return or uncaught exception, or because it was destroyed via its handle 

как комментарий @Adam Arold к ответу @ user217714. Это параллелизм.
Но это отличается от многопоточности. из std :: thread

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

Поскольку это параллелизм, он работает как многопоточность, особенно когда ожидание неизбежно (с точки зрения операционной системы), поэтому также сбивает с толку.

...