Що таке супровід?


204

Що таке супровід? Як вони пов’язані з одночасністю?


2
Паралельний код не обов'язково повинен виконуватись "паралельно" (давайте не вводимо нові терміни).
lucid_dreamer

2
Я написав одну бібліотеку корінних програм зі стандартним C, що підтримує графічні повідомлення select / poll / eplll / kqueue / iocp / Win для Linux, BSD та Windows. Це проект з відкритим кодом у github.com/acl-dev/libfiber . Поради будуть сприятливими.
ShuXin Zheng

Більше цікавої інформації тут: stackoverflow.com/q/16951904/14357
витрачається

Я можу уявити, що це питання буде неприйнятним, якщо його зададуть у цю нинішню епоху. Не впевнені, чому існує така велика різниця сприйняття громади порівняно з раніше?
tnkh

сопрограммное це функція , яка може зупинити виконання до досягнення повернення, і це побічно може передати управління іншій співпрограми в протягом деякого часу.
hassanzadeh.sd

Відповіді:


138

Коротиції та паралельність є значною мірою ортогональними. Супроводи - це загальна структура управління, за допомогою якої управління потоком спільно передається між двома різними процедурами без повернення.

Заява "врожайність" в Python - хороший приклад. Він створює супровід. Коли зустрічається "урожай", поточний стан функції зберігається, а керування повертається до викличної функції. Потім функція виклику може перенести виконання назад у функцію отримання, і його стан буде відновлено до того моменту, коли виник "вихід" і виконання буде продовжуватися.


19
Яка різниця між викликом функції безпосередньо та виведенням із програми з вкручуванням цієї функції в цю програму?
Мін Лі

3
Можливо, краще пояснити, що ці два поняття тоді насправді не є «ортогональними». Ви точно можете намалювати, наскільки ці два поняття схожі між собою. Ідея передачі контролю між двома або більше речами дуже схожа.
steviejay

8
Coroutines are a general control structure whereby flow control is cooperatively passed between two different routines without returning.<- Це є паралелізм. Слово, яке ви шукаєте, - паралелізм.
Адам Арольд

@steviejay orthogonal = Not similar to each other?
tonix

1
@tonix Мені сказали, що orthogonalозначає "незалежний один від одного".
Рік

77

З програмування в Луа , Coroutinesрозділ " ":

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

Отже, справа в тому, що супроводи - це "співпраця". Навіть у багатоядерній системі існує лише одна коренева програма, що працює в будь-який момент часу (але паралельно може працювати декілька потоків). Між кооперативами немає попередження, що працює програма повинна чітко відмовитись від виконання.

Для " concurrency" можна вказати слайд Роб Пайк :

Паралельність - це склад незалежно виконуваних обчислень.

Отже, під час виконання програми A, він передає контроль над програмою B. Потім через деякий час, програма B передає керування назад до програми А. Оскільки між супротинами існує залежність , і вони повинні виконуватись у тандемі, тож ці дві процедури не є одночасними .


6
Розслідування не виконуються самостійно. Вони по черзі, кожен чекаючи, коли інший виконає якусь частину роботи. Вони активно координують один одного. Це протилежне визначенню Роб Пікс про одночасність.
Ерік Г. Хагстром

2
@ ErickG.Hagstrom: Хоча вони не виконуються самостійно, логіка кожної програми може бути незалежною, правда? Якщо це правильно, це так само, як неперешкоджаюча ОС, що працює на одноядерному процесорі, один процес повинен відмовитись від процесора, щоб дозволити виконувати інші завдання.
Нан Сяо

6
Існує різниця між відмовою від центрального процесора, щоб запустити якусь іншу задачу , і кажучи про якийсь інший процес, який настав час виконати. Супроводи роблять останнє. Це не є незалежним у жодному сенсі.
Ерік Г. Хагстром

7
@ChrisClark Я з вами згоден. Супроводи - це паралельність. Ось декілька цитат із вікіпедії: Короутини дуже схожі на теми. Однак, супроводи мають спільну багатозадачність, тоді як нитки зазвичай є багатозадачними. Це означає, що вони забезпечують одночасність, але не паралелізм .
smwikipedia

3
І: Кооперативна багатозадачність, також відома як непереважна багатозадачність, це стиль комп'ютерної багатозадачності, в якій операційна система ніколи не ініціює перехід контексту з запущеного процесу на інший процес. Натомість, процеси добровільно дають контроль періодично або коли в режимі очікування або логічно блокуються, щоб дозволити одночасно запускати кілька додатків.
smwikipedia

47

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

Я знайшов цю відповідь тут дуже корисною:

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

Цитувати з Ідана Ар'є:

На основі вашої історії я б сказав так:

Ви починаєте дивитися мультфільм, але це вступ. Замість того, щоб дивитися вступ, ви переходите до гри та заходите в онлайн-вестибюль - але для цього потрібні 3 гравці, і в ньому ви лише ви та ваша сестра. Замість того, щоб чекати іншого гравця, ви перейдете на домашнє завдання та дайте відповідь на перше запитання. Друге питання містить посилання на відео YouTube, яке вам потрібно переглянути. Ви відкриваєте її - і вона починає завантажуватися. Замість того, щоб чекати, коли він завантажиться, ви переходите назад до мультфільму. Вступ закінчено, тому ви можете дивитися. Зараз є рекламні ролики - але тим часом третій гравець приєднався, тому ви переходите до гри І так далі ...

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

Однозначно перевірте посилання, є набагато більше, що я не можу все процитувати.


6
Дуже проста та прямолінійна ілюстрація. +1 для цього.
Таслім Осені

чудова ілюстрація. Я побудував подібну історію - зі стоячи в черзі, очікуючи, щоб зібрати пакет. але на сьогодні ваш набагато реалістичніший, хто стоїть у черзі, коли є поставки в двері? Лол
аполак

1
Це дивовижне пояснення. З самої цитати це дуже зрозуміло.
Фаррух Хабібуллаєв

15

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


Він не так схожий на нитки - які працюють незалежно і одночасно (окремі ядра паралельно). Крім того, порівняння підпрограми не вдається в тому сенсі, що існує кілька незалежних шляхів виконання, і вони не повертають один одному результати.
javadba

11
  • Коротині - чудові функції, доступні в мові Котліна
  • Супроводи - це новий спосіб написання асинхронного, неблокуючого коду (та багато іншого)
  • Споруда - це легкі нитки. Легка нитка означає, що вона не відображається на рідній нитці, тому не потребує контекстного перемикання на процесор, тому вони швидші.
  • він не відображається на рідній темі
  • Коротині та нитки - це багатозадачність. Але різниця полягає в тому, що нитками керує ОС та супроти роботи користувачами.

В основному, існують два типи розслідувань:

  1. Безрезультатний
  2. Складний

Котлін реалізує безпроблемні розробки - це означає, що у корутин немає власного стека, тому вони не відображають на власній темі.

Це функції для запуску програми:

launch{}

async{}

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

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

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


1
Хороша відповідь! Корисно для розробників Kotlin та Android.
Malwinder Singh

5

З іншого боку, geventбібліотека python - це coroutineзаснована мережева бібліотека, яка надає функції, що нагадують потоки, такі як мережеві запити асинхронізації, без накладних витрат на створення та руйнування потоків. Використовувана coroutineбібліотека є greenlet.


2

З програми Python :

Виконання процедур Python можна призупинити та відновити у багатьох пунктах (див. Програму). Всередині основи функції підпрограми ідентифікатори очікування та асинхронізації стають зарезервованими ключовими словами; очікуйте виразів, асинхронізація та асинхронізація за допомогою можна використовувати лише в органах функцій підпрограми.

З питань супроводу (C ++ 20)

Спрограма - це функція, яка може призупинити виконання, щоб відновити її пізніше . Супротивники є безрезультатними: вони призупиняють виконання, повертаючись до абонента. Це дозволяє отримати послідовний код, який виконується асинхронно (наприклад, для обробки неблокуючих вводу / виводу без явних зворотних викликів), а також підтримує алгоритми для ледачих обчислених нескінченних послідовностей та інших застосувань.

Порівняйте з відповіддю інших:

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

З іншого боку, супроводи є спільними: у будь-який момент програма із супровідними програмами виконує лише одну зі своїх процедур, і ця запущена співпрограма призупиняє її виконання лише тоді, коли вона прямо вимагає призупинення.

Оскільки він цитується з програми в Луа, можливо, це пов'язана з мовою (не знайома з 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)

Оскільки це паралельно, він працює як багатопотокове, особливо коли очікування неминуче (з точки зору ОС), тому це також заплутано.


1

Спрограма - це особливий вид підпрограми. Замість того, щоб взаємозв'язок між абонентом і викликаною підпрограмою, що існує із звичайними підпрограмами, більш справедливими є, що викликає або називають супроводи.

  • Спрограма - це підпрограма, яка має кілька записів і сама контролює їх - підтримується безпосередньо в Lua

  • Також називається симетричним керуванням: абонент і називаються супроводи на більш рівній основі

  • Виклик спільної програми називається резюме

  • Перше резюме програми розроблено до її початку, але наступні дзвінки вводяться в точку одразу після останнього виконаного оператора у програмі

  • Розслідування неодноразово поновлюють один одного, можливо, назавжди

  • Супроводи забезпечують квазі одночасне виконання програмних підрозділів (розробки); їх виконання переплітається, але не перетинається

Приклад1 Приклад2


1

Я вважаю, що пояснення за цим посиланням досить прямо вперед. Жодна з цих відповідей не намагається пояснити паралельність та паралелізм, за винятком останньої точки в цій відповіді .

  1. що паралельно (програма)?

цитується з "програмування Ерланг", Джо Армстронга, легендарного:

паралельна програма може працювати швидше на паралельному комп'ютері.

  • паралельна програма - це програма, написана одночасно мовою програмування. Ми пишемо паралельні програми з міркувань продуктивності, масштабованості або відмовостійкості.

  • паралельна мова програмування - це мова, яка має чіткі мовні конструкції для написання одночасних програм. Ці конструкції є невід'ємною частиною мови програмування і поводяться однаково у всіх операційних системах.

  • паралельний комп'ютер - це комп’ютер, який має декілька процесорних блоків (процесорів або ядер), які можуть працювати одночасно.

Тож паралельність - це не те саме, що паралелізм. Ви все одно можете записувати одночасні програми на одноядерний комп'ютер. Завдяки планувальнику розподілу часу ви відчуєте, що програма працює одночасно.

Паралельна програма може потенційно працювати паралельно на комп'ютері, але не гарантується . ОС може дати вам лише одне ядро ​​для запуску програми.

Таким чином, паралельність - це програмна модель із паралельної програми, що не означає, що ваша програма може працювати паралельно фізично.

  1. супровід і паралельність

Слово «співавтор» складається з двох слів: «спів» (кооператив) та «підпрограми» (функції).

а. чи досягається це одночасність чи паралелізм?

Щоб бути простим, давайте обговоримо це на одноядерному комп'ютері.

Паралельність досягається за рахунок частки часу від ОС. Потік виконує свій код у встановлені часові рамки на ядрі процесора. Це може бути викуплено ОС. Він також може контролювати ОС.

Спрограма, з іншого боку, дає контроль іншій програмі в потоці, а не ОС. Таким чином, усі спроби в потоці все ще використовують часові рамки для цього потоку, не поступаючись ядром процесора іншим потокам, керованим ОС.

Таким чином, ви можете думати про те, що коректна програма домагається часу, який користувач не використовує ОС (або квазіпаралелізм). Супроводи виконуються на тому ж ядрі, призначеному для потоку, який виконує ці розробки.

Чи досягає Коронтіна паралелізм? Якщо це код, пов'язаний з процесором, ні. Як і частки часу, ви відчуваєте, що вони працюють паралельно, але їх виконання не переплітаються, а не перетинаються. Якщо він пов'язаний з IO, так, він досягає паралельних апаратних засобів (пристроїв вводу-виводу), а не вашого коду.

б. різниця від виклику функції?

введіть тут опис зображення

Як показано на малюнку, returnдля переключення управління не потрібно дзвонити . Він може даватись без return. Спрограма зберігає та ділиться станом на поточному функціональному кадрі (стеку). Таким чином, це набагато легше ніж функція, оскільки вам не потрібно зберігати регістри та локальні змінні для складання та перемотування стека викликів, коли call ret.


0

Я розгорну відповідь на @ user21714. Супроводи - це самостійні шляхи виконання, які не можуть працювати одночасно. Вони залежать від контролера - наприклад, pythonбібліотеки контролерів - для управління перемиканням між цими шляхами. Але для цього в роботі корутин потрібно попросити самих себеyield або подібні структури, які дозволяють призупинити їх виконання.

Натомість потоки працюють на незалежних обчислювальних ресурсах і паралельно один одному. Оскільки вони знаходяться на різних ресурсах, не потрібно викликати дохід, щоб дозволити продовжувати інші шляхи виконання.

Цей ефект можна побачити, запустивши багатопотокову програму - наприклад, jvmпрограму - в якій використовуються всі вісім ваших core i7ядер гіперточок: ви можете бачити 797% використання в Activity Monitorабо Top. Натомість при запуску типової pythonпрограми - навіть однієї з coroutinesабо python threading- використання буде максимальною на 100%. Тобто одна машинна гіперточка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.