Korutinokat (korutiny, coroutine) -, hogy ez a verem túlcsordulás az orosz

Coroutine (korutiny, coroutine) - egy kódfuttatást patakok, amelyek felett elhelyezett hardver (rendszer) áramlik.
Flow végrehajtási kódot - a műveletek sorrendjét, amelyek végre egymás után. Megfelelő időpontokban, ez a szekvencia lehet függeszteni, és ahelyett, hogy lehet kezdeni végrehajtó a másik része a műveletek sorrendjét.

Rendszerű adatfolyamok áll processzor utasításokat, és egy egymagos processzor futtatni több sorban rendszerű adatfolyamok.
Korutinokat dolgozni egy magasabb szinten - több korutinokat felváltva feladataik kód egy rendszeren patak. (Attól függően, hogy a végrehajtás coroutine nem köthetők egy adott rendszer adatfolyam, például hajtja végre a kódot a thread pool).

Ellentétben rendszerű adatfolyamok vannak kapcsolva rendszer tetszőleges időzítéssel (preemptív multitasking) coroutine kapcsolva manuálisan meghatározott területen a programozó (kooperatív multitasking).

Jelöljük műveletek coroutine alábbiak szerint:

  • kezelni = spawn (SP); - indítani coroutine,
  • hozam; - a felfüggesztés a jelenlegi coroutine
  • folytatódik (fogantyú); - megújításakor coroutine.

Vegyünk két korutinokat:

Aztán, ha egy rendszer szála SP1, SP2 és újabb, a rendszer menet a művelet végrehajtásához a következő determinisztikus sorrendben:

Mivel mindkét coroutine végrehajtható egy rendszer adatfolyam, az adatok nem lehetséges faj között a kód így egy atomically végrehajtott (ezen belül a rendszer adatfolyam).

Ha fut minden coroutine egy külön rendszerben folyik, akkor nem különbözik a normál rendszer áramlás - lesz kapcsolva, ha a rendszer azt fogja mondani, szinkronizálni kell, hogy elkerülje az adatok versenyeken.

aszinkron műveletek

Az egyik fő alkalmazási forgatókönyvek coroutine - ez az aszinkron művelet, mint például input-output és az animációk a felhasználói felületen. A rajt után a aszinkron működés, CO-rutin teheti hozamot és folytatta befejezése után ezt a műveletet. Ebben az esetben a rendszer menet, amikor készült, nem alszik a korutinokat, de továbbra is ingyenes a másik korutinokat.

Hagyományos aszinkron kód használatával jár visszahívókat függvényparaméterek, valamint a jövőbeli / ígéret:

Amennyiben callback - olyan funkció, amely fogják hívni vége után egy aszinkron írni. Ahogy visszahívásokra használni Lambda funkciót, például a C ++ szintaxis:

Bemutatjuk a művelet fogantyú = get_coroutine_handle ();. amely kiadja a fogantyú (context) a kód maga coroutine coroutine.
Azután az coroutine írhat:

Az egyszerűség kedvéért számos nyelv használja várnak Önre operátor. ami csökkenti a kódot

Egy részletesebb példáját:

generátorok

Egy másik forgatókönyv használata korutinokat - a „generátor”, korutinokat, amely létrehoz egy sorozata hasonló tárgyak, például egy számsorozat:

Itt kapjuk kivéve generátor is megkapja a stop értéket, amelyeket ki generátort.

Stackful végrehajtási korutinokat

Ahogy a neve is mutatja, stackful (stack) korutinokat - egy coroutine, akik saját verem, mint a rendszer szál. A fő különbség a szokásos ilyen coroutine rendszer szál - az, hogy váltani kézzel. Összehasonlítva a sebesség kapcsoló rendszer szál, kapcsolási coroutine gyakorlatilag mentes (száz processzor ciklus). Mivel azonban az a tény, hogy az egyes coroutine kell kiosztani egy külön verem, és egyéb szolgáltatási adatok szerkezete - a teremtés és a lét nem kevesebb, mint az egy rendszer patak.

A Windows stackful korutinokat építettek be a rendszerbe, és az úgynevezett rostok (a rost, rost). A szálakat a rendszerhez csatlakoztatott áramban, amelyben készült, kapcsoló (hozam / Folytatás) funkció valósul SwitchToFiber (fiber_handle).

Kezdve stackful coroutine nem különbözik a hagyományos ravaszt patak és így néz ki:

Miután a saját stack lehetővé hozama beágyazott függvény hívások.
Azonban, mivel a stackful korutinokat meglehetősen drága, nem lehet őket használni, hogy egyszerű generátorok.

Felhalmozás nélküli, alapkiépítésben végrehajtási korutinokat

Felhalmozás nélküli, alapkiépítésben (bezstekovye) coroutine nem függ az operációs rendszer, és végre kizárólag útján fordító: coroutine kódot újraírták objektum állapotú gép, a lokális változók osztják nem a verem, és tagjai lesznek az adott objektumot.

Ellentétben stackful korutinokat a verem nélkül coroutine hozam csak a testében. Nem lehet, hogy a hozam függvény okozta coroutine.

Létrehozása bezstekovoy korutinokat -, hogy hozzon létre egy objektumot, amely tárolja az állapotát (__fib), és általában úgy néz ki, mint egy függvényhívás:

@ixSci, igen, bizonyos értelemben azt lehet mondani: „coroutine nem függ jelenlétében stream”, de általában úgy hangzik, mint a „a program nem függ a CPU-t.” Írtam a rendszer folyamok, mert fontos összefüggésben szinkronizációs problémák - ha a coroutine futtatni a különböző rendszerű adatfolyamok, az adatok verseny lehetséges, ha végzett egy - a verseny lesz. - Abyx február 22 '16 at 18:36

korutiny, ASINKOM és egyéb dolgokat, egy olyan fejlesztési módszer, amely sikerül megszabadulni lasing szálak és folyamatok (elkerülése érdekében mindenféle kapcsoló és inicializálás), miközben egy pszeudo-kód végrehajtását. A mögöttes siskol select / poll amely felett navorocheno tonna cukor dzsungel melyek azonos kódot egy áramlási játszik IO műveletek közötti váltáshoz úgynevezett korutinami (tobish rendes funkció). Ilyen esetekben;)