Что такое сопрограмма? Как они связаны с параллелизмом?
terminology
coroutine
yesraaj
источник
источник
Ответы:
Сопрограммы и параллелизм в значительной степени ортогональны. Сопрограммы представляют собой общую структуру управления, посредством которой управление потоком совместно передается между двумя различными процедурами без возврата.
Оператор yield в Python является хорошим примером. Это создает сопрограмму. Когда встречается «yield», текущее состояние функции сохраняется, и управление возвращается вызывающей функции. Вызывающая функция может затем передать выполнение обратно в функцию-получатель, и ее состояние будет восстановлено до точки, где был обнаружен «yield», и выполнение продолжится.
источник
Coroutines are a general control structure whereby flow control is cooperatively passed between two different routines without returning.
<- Это является параллелизм. Слово, которое вы ищете, это параллелизм.orthogonal = Not similar to each other
?orthogonal
означает "независимые друг от друга".Из раздела Программирование на Lua ,
Coroutines
раздел " ":Итак, суть в том, что сопрограммы являются «совместными». Даже в многоядерной системе в каждый момент времени работает только одна сопрограмма (но несколько потоков могут работать параллельно). Между сопрограммами нет вытеснения, запущенная сопрограмма должна явно отказаться от выполнения.
Для "
concurrency
" вы можете сослаться на слайд Роба Пайка :Таким образом, во время выполнения сопрограммы A она передает управление сопрограмме B. Затем через некоторое время сопрограмма B передает управление обратно сопрограмме A. Поскольку существует зависимость между сопрограммами, и они должны работать в тандеме, поэтому две сопрограммы не являются параллельными .
источник
Я нахожу большинство ответов слишком техническими, хотя это технический вопрос. Мне было трудно понять процесс сопрограммы. Я как бы понимаю, но потом не понимаю.
Я нашел этот ответ очень полезным:
https://dev.to/thibmaek/explain-coroutines-like-im-five-2d9
Цитировать от Идана Арье:
Обязательно проверьте ссылку, там гораздо больше, что я не могу все процитировать.
источник
Сопрограмма похожа на подпрограмму / темы. Разница заключается в том, что как только вызывающая сторона вызывает подпрограмму / потоки, она никогда не вернется к функции вызывающей стороны. Но сопрограмма может вернуться к вызывающей стороне после выполнения нескольких фрагментов кода, позволяя вызывающей стороне выполнить часть своего собственного кода и вернуться к точке сопрограммы, где она остановила выполнение и продолжила оттуда. то есть. Сопрограмма имеет более одной точки входа и выхода
источник
В основном, есть два типа сопрограмм:
Kotlin реализует сопрограммы без стеков - это означает, что сопрограммы не имеют собственного стека, поэтому они не отображаются в нативный поток.
Это функции для запуска сопрограммы:
Вы можете узнать больше здесь:
https://www.kotlindevelopment.com/deep-dive-coroutines/
https://blog.mindorks.com/what-are-coroutines-in-kotlin-bf4fecd476e9
источник
С другой стороны, в
gevent
библиотеке Python естьcoroutine
сетевая библиотека, которая предоставляет вам нитевидные функции, такие как асинхронные сетевые запросы, без дополнительных затрат на создание и уничтожение потоков.coroutine
Библиотека используетсяgreenlet
.источник
Из Python Coroutine :
Из сопрограмм (C ++ 20)
Сравните с ответом другого:
На мой взгляд, возобновленная более поздняя часть - это принципиальное отличие, как у @ Twinkle's.
Хотя многие поля документа все еще находятся в стадии разработки, тем не менее, эта часть похожа на большинство ответов, за исключением @Nan Xiao's
Поскольку он цитируется в программе на Lua, возможно, он связан с языком (в настоящее время не знаком с Lua), не во всех документах упоминается только одна часть.
Отношение с одновременным:
есть часть «Выполнение» сопрограмм (C ++ 20). Слишком долго цитировать здесь.
Помимо деталей, есть несколько состояний.
как комментарий @Adam Arold под ответом @ user217714. Это параллелизм.
Но это отличается от многопоточности. из std :: thread
Так как это параллелизм, он работает как многопоточность, особенно когда ожидание неизбежно (с точки зрения ОС), поэтому также сбивает с толку.
источник
Сопрограмма - это особый вид подпрограммы. Вместо того, чтобы отношения «ведущий-ведомый» между вызывающим и вызываемой подпрограммой, существующие с обычными подпрограммами, вызывающий и вызываемые сопрограммы более справедливы.
Сопрограмма - это подпрограмма, которая имеет несколько записей и сама управляет ими - поддерживается непосредственно в Lua
Также называется симметричным управлением: вызывающий и вызываемые сопрограммы находятся на более равной основе.
Вызов сопрограммы называется резюме
Первое возобновление сопрограммы находится в ее начале, но последующие вызовы вводятся в точке сразу после последнего выполненного оператора в сопрограмме.
Сопрограммы неоднократно возобновляют друг друга, возможно, навсегда
Сопрограммы обеспечивают квази-параллельное выполнение программных блоков (сопрограммы); их исполнение чередуется, но не перекрывается
источник
Я нахожу объяснение по этой ссылке довольно простым. Ни один из этих ответов не пытается объяснить параллелизм и параллелизм, кроме последнего пункта в этом ответе .
цитируется из "программирования Erlang" Джо Армстронга, легендарного:
Параллельная программа - это программа, написанная на параллельном языке программирования. Мы пишем параллельные программы по причинам производительности, масштабируемости или отказоустойчивости.
Параллельный язык программирования - это язык, который имеет явные языковые конструкции для написания параллельных программ. Эти конструкции являются неотъемлемой частью языка программирования и ведут себя одинаково во всех операционных системах.
параллельный компьютер - это компьютер с несколькими процессорами (процессорами или ядрами), которые могут работать одновременно.
Таким образом, параллелизм - это не то же самое, что параллелизм. Вы все еще можете писать параллельные программы на одноядерном компьютере. Планировщик с разделением времени позволит вам почувствовать, что ваша программа работает одновременно.
Параллельная программа может работать параллельно на параллельном компьютере, но это не гарантируется . ОС может дать вам только одно ядро для запуска вашей программы.
Следовательно, параллелизм - это программная модель параллельной программы, которая не означает, что ваша программа может работать параллельно физически.
а. это достигает параллелизма или параллелизма?
Проще говоря, давайте обсудим это на одноядерном компьютере.
Параллельность достигается за счет доли времени от ОС. Поток выполняет свой код в назначенные ему временные рамки на ядре ЦП. Это может быть прервано ОС. Это также может дать контроль над ОС.
Сопрограмма, с другой стороны, передает управление другой сопрограмме в потоке, а не ОС. Таким образом, все сопрограммы в потоке все еще используют временные рамки для этого потока, не уступая ядру ЦП другим потокам, управляемым ОС.
Таким образом, вы можете думать, что сопрограмма достигает доли времени пользователем, а не ОС (или квазипараллелизмом). Сопрограммы работают на том же ядре, которое назначено потоку, который запускает эти сопрограммы.
Coroutine достигает параллелизма? Если это код с привязкой к процессору, нет. Как и при распределении времени, вы чувствуете, что они работают параллельно, но их исполнения чередуются, а не перекрываются. Если он связан с вводом-выводом, да, он выполняется параллельно с помощью аппаратного обеспечения (устройства ввода-вывода), а не вашего кода.
б. разница с вызовом функции?
Как показано на рисунке,
return
для переключения управления не нужно звонить . Это может дать безreturn
. Сопрограмма сохраняет и разделяет состояние в текущем фрейме функции (стеке). Так что это намного легче, чем функция, так как вам не нужно сохранять регистры и локальные переменные в стеке и перематывать стек вызовов, когдаcall ret
.источник
Я буду расширять ответ @ user21714. Сопрограммы - это независимые пути выполнения, которые не могут выполняться одновременно. Они зависят от контроллера - например,
python
библиотеки контроллера - для обработки переключения между этими путями. Но для этого для работы самих сопрограмм нужно вызватьyield
или подобные структуры, которые позволяют приостановить их выполнение.Вместо этого потоки работают на независимых вычислительных ресурсах и параллельно друг с другом. Так как они находятся на разных ресурсах, нет необходимости вызывать yield, чтобы продолжить выполнение других путей выполнения.
Вы можете увидеть этот эффект, запустив многопоточную программу - например,
jvm
приложение - в котором используются все восемь вашихcore i7
ядер с гиперпоточностью: вы можете увидеть 797% использования вActivity Monitor
илиTop
. Вместо этого при запуске типичнойpython
программы, даже сcoroutines
или,python threading
использование будет максимально на 100%. Т.е. одна машина с гиперпоточностью.источник