2009-02-16 21 views
97

Co to jest coroutine? W jaki sposób są powiązane ze współbieżnością?Co to jest coroutine?

+0

kod Jednoczesne nie musi koniecznie działać w "równoległe" (nie wprowadzajmy nowych terminów). – user1712447

+0

Napisałem jedną coroutine library ze standardowym C, obsługującym komunikaty GUI select/poll/eplll/kqueue/iocp/Win dla Linux, BSD i Windows. Jest to projekt open source w https://github.com/acl-dev/libfiber. Porady będą mile widziane. –

Odpowiedz

80

Corutines i współbieżność są w większości prostopadłe. Coruleny są ogólną strukturą kontrolną, w której kontrola przepływu jest kooperacyjnie przekazywana pomiędzy dwiema różnymi procedurami bez zwracania.

Przykładem jest "yield" w Pythonie. Tworzy coroutine. Po napotkaniu "yield" aktualny stan funkcji zostaje zapisany, a sterowanie powraca do funkcji wywołującej. Funkcja wywołująca może następnie przenieść wykonanie z powrotem do funkcji plonowania, a jej stan zostanie przywrócony do punktu, w którym napotkano "wydajność", a wykonanie będzie kontynuowane.

+9

Jaka jest różnica między wywołaniem funkcji bezpośrednio a uzyskaniem z coroutine z zawijaniem tej funkcji do tego coroutine? –

+1

Może lepiej wytłumaczyć, że te dwa pojęcia nie są tak naprawdę "ortogonalne" w tym kontekście. Możesz z pewnością narysować, jak te dwie koncepcje są do siebie podobne. Pomysł przejęcia kontroli między dwiema lub więcej rzeczami jest bardzo podobny. – steviejay

29

Od Programming in LuaCoroutines” odcinek:

współprogram jest podobna do wątku (w sensie wielowątkowości): jest to linia wykonania, z własnym stosie, własnych zmiennych lokalnych, i jego własny wskaźnik instrukcji; ale współdzieli zmienne globalne i przeważnie wszystko inne z innymi współprogramami. Główna różnica między wątkami i współprogramami polega na tym, że konceptualnie (lub dosłownie w maszynie wieloprocesorowej) program z wątkami wykonuje równolegle kilka wątków. Z drugiej strony, Coroutines współpracują ze sobą: w dowolnym momencie program z coroutinesami działa tylko jeden ze swoich współprogramów, a ten działający coroutine zawiesza jego wykonanie tylko wtedy, gdy jednoznacznie prosi o zawieszenie.

Chodzi o to, że: Coroutines są "oparte na współpracy". Nawet w systemie wielordzeniowym istnieje tylko jeden biegacz działający w danym momencie (ale wiele wątków może działać równolegle). Pomiędzy coroutinami nie ma opcji zapobiegawczej, biegły coroutine musi wyraźnie zrezygnować z wykonania.

Dla "concurrency", można odnieść Rob Pike slide:

współbieżności jest skład niezależnie wykonujących obliczenia.

więc podczas wykonywania współprogram za to przekazuje kontrolę do współprogram B. Następnie po jakimś czasie, współprogram B przekazuje kontrolę z powrotem do współprogram A. Ponieważ istnieje zależność między współprogram i muszą pracować w tandemie, więc dwaj partnerzy są nie współbieżni.

+0

Uwielbiałem tę odpowiedź, aż dotarłem do ostatniego zdania. Co to znaczy? Czy błędnie napisałeś "współbieżność"? Jeśli tak, to wniosek ten nie pasuje do podanej definicji. Czy może to być nowe słowo "concurreny"? Co oznacza to słowo? –

+0

@ ErickG.Hagstrom: Przepraszam, błędnie napisałem "współbieżność". Jak myślisz, dlaczego wniosek nie pasuje do podanej definicji? –

+0

Coroutines nie działają niezależnie. Robią po kolei, każdy czeka na drugiego, aby wykonać część pracy. Aktywnie koordynują ze sobą. Jest to przeciwieństwo definicji współbieżności Roba Pikesa. –

6

Coroutine jest podobna do podprogramu/wątków. Różnica polega na tym, że gdy wywołujący wywoła podprogram/wątki, nigdy nie wróci do funkcji wywołującej. Ale osoba kontaktowa może powrócić do dzwoniącego po wykonaniu kilku kawałków kodu, umożliwiając dzwoniącemu wykonanie części własnego kodu i powrót do punktu kontrolnego, w którym zatrzymał wykonywanie i kontynuował od tego. tj. Współprogram ma więcej niż jeden punktów wejścia i wyjścia

1

Na innej notatki, w Pythonie gevent Biblioteka jest coroutine oparty biblioteki sieci, która daje nitkowate funkcje, takie jak żądania sieciowe asynchroniczny, bez obciążania tworzenia i niszczenia wątków. Używana biblioteka coroutine to greenlet.

0
  • współprogram są świetne funkcje dostępne w Kotlin Językowych
  • współprogram to nowy sposób pisania asynchroniczne, non-blocking kod (i dużo więcej)
  • współprogram nici są lekkie. Wątek o małej wadze oznacza, że ​​ nie mapuje natywnego wątku, więc nie wymaga przełączania kontekstu na procesorze, dzięki czemu są one szybsze.
  • Nie mapuje się na natywny wątek
  • Coroutines i wątki są wielozadaniowe. Ale różnica polega na tym, że wątki są zarządzane przez system operacyjny i kontury użytkowników.

Zasadniczo istnieją dwa rodzaje współprogram:

  1. Stackless
  2. Stackful

Kotlin realizuje współprogram Stackless - to znaczy, że współprogram nie mają własny stos, więc nie mapują natywnego wątku.

Są to funkcje, aby rozpocząć ten współprogram:

launch{} 

async{} 

można dowiedzieć się więcej tutaj:

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

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