Что такое сопрограмма? Как они связаны с 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), чтобы делать другие вещи, которые требуют вашего прямого внимания.
Определенно проверьте ссылку, есть намного больше, что я не могу процитировать все.