Coroutine vs tęsinys vs generatorius

Koks skirtumas tarp coroutine ir tęstinumo bei generatoriaus?

124
04 апр. Mehdi Asgari nustatytas balandžio 04 d 2009-04-04 00:19 '09 ne 0:19 2009-04-04 00:19
@ 3 atsakymai

Pradėsiu nuo generatorių, matydamas, kad tai paprasčiausias atvejis. Kaip pažymėjo @zvolkov, tai yra funkcijos / objektai, kuriuos galima pakartotinai skambinti be grįžimo, bet kai ramybė grąžina (grąžina) vertę ir sustabdo jų vykdymą. Kai jie vėl kviečiami, jie prasidės nuo tos vietos, kur jie paskutinį kartą sustabdė vykdymą, ir dar kartą atlieka savo darbą.

Generatorius iš esmės yra sutrumpintas (asimetrinis) coroutine. Skirtumas tarp coroutine ir generatoriaus yra tas, kad coroutine po pradinio skambučio gali pareikšti argumentus, o generatorius negali.

Tai yra šiek tiek sunku kai kuriems trivialus pavyzdys, kur jūs naudojate coroutines, bet čia yra mano geriausias bandymas. Paimkite šį (kompiliuojamą) „Python“ kodą kaip pavyzdį.

 def foo(x, y, cc): cc(max(x, y)) biggest = callcc(foo, [23, 42]) print biggest 

Kas atsitinka, tai, kad callcc() savo ruožtu skambins foo() su dabartiniu callcc() cc ), ty nuoroda į programos tašką, kuriame buvo iškviestas callcc() . Kai foo() skambina dabartiniam tęstinumui, jis iš esmės sutampa su callcc() pranešimu, kad sugrįžtumėte su verte, kurią skambinate dabartiniame tęsinyje, ir, kai tai daroma, jis sukasi atgal į kaminą, kur buvo sukurta dabartinė tęsinys, t.y. skambindami „ callcc() .

Visa tai lemia tai, kad mūsų hipotetinė „Python '42' versija spausdins '42' .

Tikiuosi, kad tai padės, ir esu tikras, kad mano paaiškinimai gali būti gerokai geresni!

104
04 апр. Atsakė Keith Gaughan balandžio 04 2009-04-04 01:05 '09, 1:05 2009-04-04 01:05

„Coroutine“ yra viena iš kelių procedūrų, kurios savo ruožtu atlieka savo darbą, o po to sustoja, kad suteiktų kontrolę kitoms grupės grupėms.

Tęsinys yra „rodyklė funkcijai“, kurią perduodate bet kuriai procedūrai, kuri bus vykdoma („tęsiama nuo“), kai ši procedūra bus vykdoma.

border=0

Generatorius („.NET“) yra kalbos konstrukcija, galinti išskleisti vertę, „sustabdyti“ metodo vykdymą ir tada eiti iš to paties taško, kai prašoma pateikti kitą vertę.

29
04 апр. atsakymas pateikiamas zvolkov 04 balandžio. 2009-04-04 00:29 '09 ne 0:29 2009-04-04 00:29

Naujausioje „Python“ versijoje galite siųsti vertes generatoriams su generator.send() , todėl python generatoriai efektyviai programuojami.

Pagrindinis skirtumas tarp „python“ generatoriaus ir kito generatoriaus, pvz., „Greenlet“, yra tas, kad pythone jūsų yield value gali būti grąžinta tik skambinančiajam. Žaliuzėje, target.switch(value) gali pereiti prie konkretaus tikslo „coroutine“ ir gauti vertę, kurioje bus tęsiamas target vykdymas.

8
31 авг. Atsakymas pateikiamas Yichuan Wang 31 d. 2011-08-31 05:51 '11 at 5:51 2011-08-31 05:51

Kiti klausimai apie žymes arba Užduoti klausimą