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

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

Ответ 1

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

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

Ответ 2

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

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

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

Для "concurrency" вы можете называть Rob Pike slide:

Concurrency - это композиция независимо выполняющих вычислений.

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

В принципе, существуют два типа Coroutines:

  • Stackless
  • Stackful

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

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

launch{}

async{}

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

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

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

Ответ 6

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

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

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

Процитировать от Идана Ариэ:

Чтобы опираться на вашу историю, я бы сказал, что это примерно так:

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

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

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