Naučení se asynchronnímu programování

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #15 kdy: 07. 10. 2019, 12:44:46 »
Jak nekoho vidim, ze bastli backend a ze srandy to dela asynchronni, tak se mi otevira kudla v kapse.
Přehnaně asynchronni aplikace se často plní omáčkou, zhoršuje se její čitelnost a bezpečnost.
Od toho jsou korutiny, aby synchronně vypadající kód běžel asynchronně.


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #16 kdy: 07. 10. 2019, 12:49:57 »
Byla delší, vypadala hustě, kolega jí nerozuměl.
s async/await se dá psát stejně stručně jako s vlákny. Většinou stručněji
Obávám se, že developerů, kteří opravdu chápou, co async/await dělá, bude relativně málo.
To ale není chyba technologie/konceptu, že to lidi nechápou. Takových témat se najde mnohem víc, třeba “the M word” ve FP.

Re:Naučení se asynchronnímu programování
« Odpověď #17 kdy: 07. 10. 2019, 12:55:16 »
To ale není chyba technologie/konceptu, že to lidi nechápou. Takových témat se najde mnohem víc, třeba “the M word” ve FP.
Jak se to veme. Já moc nemám rád koncepty, které něco relativně složitého zabalí tak, že to vypadá jednoduše, člověk může nabýt dojmu, že tomu rozumí, ale ve skutečnosti nerozumí a tímpádem právě není schopnej toho reasoningu* nad kódem. Proto osobně async/await nemám rád. Daleko lepší mi přijdou ty korutiny, to je koncept, kterej nic neschovává, člověk na první pohled vidí, co se tam děje. A ještě lepší jsou úplně ne-kooperativní procesy v Erlangu (korutiny v Go, alespoň donedávna, byly částečně kooperativní, IIRC - přepínalo se jenom na některých místech).


* sorry za opakování tohodle slova, ale přijde mi výstižný a neznám podobně dobrý český ekvivalent

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #18 kdy: 07. 10. 2019, 13:30:20 »
To ale není chyba technologie/konceptu, že to lidi nechápou. Takových témat se najde mnohem víc, třeba “the M word” ve FP.
Jak se to veme. Já moc nemám rád koncepty, které něco relativně složitého zabalí tak, že to vypadá jednoduše, člověk může nabýt dojmu, že tomu rozumí, ale ve skutečnosti nerozumí a tímpádem právě není schopnej toho reasoningu* nad kódem. Proto osobně async/await nemám rád. Daleko lepší mi přijdou ty korutiny, to je koncept, kterej nic neschovává, člověk na první pohled vidí, co se tam děje. A ještě lepší jsou úplně ne-kooperativní procesy v Erlangu (korutiny v Go, alespoň donedávna, byly částečně kooperativní, IIRC - přepínalo se jenom na některých místech).


* sorry za opakování tohodle slova, ale přijde mi výstižný a neznám podobně dobrý český ekvivalent
Vždyť async/await jsou právě taky jen korutiny, jen se zbytečně složitou syntaxí (proto to tolik lidí mate). Právě Go má v podstatě to samé, ale transparentně.

BTW scheduler v Go je kooperativní doposud, jede nad kqueue/IO ports apod. podle OS.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #19 kdy: 07. 10. 2019, 15:18:44 »
Goroutiny nejsou korutiny. Korutiny běží v jednom vlákně.


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #20 kdy: 07. 10. 2019, 16:23:09 »
Goroutiny nejsou korutiny. Korutiny běží v jednom vlákně.
Gorutiny taky, když máš jen jedno jádro. Je to úplně to samé, až na jedno písmenko.

gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #21 kdy: 07. 10. 2019, 16:28:26 »
nehrozí data races a jiné chyby.
V jakém smyslu? V porovnání s čím? Jaký přesně mechanismus zaručuje, že k nim nemůže dojít?
v provnání s vlákny
Dost katastrofa je to ale na úrovni infrastruktury: Pokud chci async/await použít, musím mít úplně jiné, "async" knihovny. A ty jsou oproti jejich starším "sync" variantám většinou daleko víc zabugované nebo nedodělané.

to je pravda, v tom jsou lepší jazyky, kde je asynchronní vše. Částečné řešení je volání sync variant blokujících funkcí v threadpoolu. https://docs.python.org/3/library/asyncio-eventloop.html#executing-code-in-thread-or-process-pools . Většinou si vystačíte s použitím čistě async funkcí jen pro socketovou komunikaci a ostatními IO funkcemi volanými v threadpoolu. I rozšiřující "async" knihovny například pro přístup k DB jsou většinou implementovány obalením sync funkcí run_in_executor. Další problém je existence několika nekompatibilních základních async knihoven (asyncio, trio, curio). Existuje snaha sjednotit API minimálně mezi trio a asyncio. Dost rozšiřujících knihoven podporuje obojí.

Re:Naučení se asynchronnímu programování
« Odpověď #22 kdy: 07. 10. 2019, 16:52:14 »
Vždyť async/await jsou právě taky jen korutiny, jen se zbytečně složitou syntaxí (proto to tolik lidí mate). Právě Go má v podstatě to samé, ale transparentně.
Asi podle toho, na jake urovni se na to divas. Async/await je hlavne cukr pro futures, zatimco goroutiny spis davaji pocit plne oddelenych vlaken provadeni - jako plnohodnotna OS vlakna. Implementacne to muze byt dost podobne, hlavne na urovni event loopu, ale ten koncept jako takovy je imho dost jiny - async/await je matouci a otravne, gorutiny jsou naprosto v pohode.

BTW scheduler v Go je kooperativní doposud, jede nad kqueue/IO ports apod. podle OS.
Dik. Mel jsem matny pocit, ze jsem nekde cetl, ze s tim cosi v posledni dobe delali. Bud se pletu, nebo to mozna byl nejaky plan pro Go 2? Nevim.

v provnání s vlákny
Ok. V porovnani s vlakny ale imho async/await samo o sobe negarantuje nemoznost race conditions. Porad je tam nejake prepinani kontextu, ke kteremu pri trose fantazie muze dojit v nevhodny okamzik. Tim spis, cim vic k tomu prepinani dochazi. Jestli je tam nejaky vyrazny rozdil oproti vlaknum, tak prave v tom, ze se prepina jenom v urcite okamziky, takze k race condition nemusi vubec nikdy dojit. To ale neni garance, to je (vicemene) nahoda, coz je mozna jeste horsi...

v tom jsou lepší jazyky, kde je asynchronní vše.
Bez diskuse. Vubec nechapu, proc Python touhle cestou nesel. Imho si tim pekne nabehl na vidle a co je horsi, potahne si tuhle zatez ssebou jeste pekne dlouho, protoze se z toho dost dobre ted uz neda vybrednout :(

Částečné řešení je volání sync variant blokujících funkcí v threadpoolu. https://docs.python.org/3/library/asyncio-eventloop.html#executing-code-in-thread-or-process-pools . Většinou si vystačíte s použitím čistě async funkcí jen pro socketovou komunikaci a ostatními IO funkcemi volanými v threadpoolu. I rozšiřující "async" knihovny například pro přístup k DB jsou většinou implementovány obalením sync funkcí run_in_executor.
Jo, ale to je strasnej opruz. Odstranuje to tu jedinou potencialni vyhodu async/await - prehlednost kodu. Dalsi problem je, ze v Pythonni implementaci doted chybi zakladni primitiva k tomu, aby to mohl clovek opravdu vyuzivat. Kdyz clovek zna Erlang s jeho linky, monitory, signaly, supervizory, ... tak si v Pythonu pripada, jako by mu nekdo urizl ruku, vytrhl jazyk, zavazal oci a jeste ho jenom tak jakoze ze srandy pichal spendlikama pod nehty...

Další problém je existence několika nekompatibilních základních async knihoven (asyncio, trio, curio). Existuje snaha sjednotit API minimálně mezi trio a asyncio. Dost rozšiřujících knihoven podporuje obojí.
No to je uplnej pruser, kterej jsem ani nezminil, abych se nerozcilil vic nez je nutne :) Par let zpatky to byla vylozene tragedie. Dneska nastesti asyncio hodne dobrych featur z ostatnich implementaci pohltilo a jelikoz je ve standardni knihovne, nejspis do budoucna vyhraje. Takze uz to takova traga neni. Nejlepsi je proste imho smirit se s asyncio.

Re:Naučení se asynchronnímu programování
« Odpověď #23 kdy: 07. 10. 2019, 17:00:09 »
Mel jsem matny pocit, ze jsem nekde cetl, ze s tim cosi v posledni dobe delali.
Mozna to bylo tohle https://github.com/golang/go/issues/24543 ? (Zatim?) jenom proposal.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #24 kdy: 07. 10. 2019, 17:12:53 »
Vždyť async/await jsou právě taky jen korutiny, jen se zbytečně složitou syntaxí (proto to tolik lidí mate). Právě Go má v podstatě to samé, ale transparentně.
Asi podle toho, na jake urovni se na to divas. Async/await je hlavne cukr pro futures, zatimco goroutiny spis davaji pocit plne oddelenych vlaken provadeni - jako plnohodnotna OS vlakna. Implementacne to muze byt dost podobne, hlavne na urovni event loopu, ale ten koncept jako takovy je imho dost jiny - async/await je matouci a otravne, gorutiny jsou naprosto v pohode.
Ano, myslím na implementační úrovni, kde je naprostá shoda (akorát to teda nijak nesouvisí se smyčkou událostí, jde jen o kooperativní scheduler). Ani neplatí, jak tu chybně zaznělo, že "korutiny" běží jen v jednom vlákně (to může napsat jen javascriptař, ten víc vláken nezná, ale o srandajazycích se snad nebavíme :) ).

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #25 kdy: 07. 10. 2019, 17:16:43 »
BTW scheduler v Go je kooperativní doposud, jede nad kqueue/IO ports apod. podle OS.
Dik. Mel jsem matny pocit, ze jsem nekde cetl, ze s tim cosi v posledni dobe delali. Bud se pletu, nebo to mozna byl nejaky plan pro Go 2? Nevim.
Ne ne, akorát přidali přepínání korutin i k volání funkcí, takže když nějaká gorutina běží moc dlouho a volá funkci, která není async, tak se stejně může vykonávání přerušit a scheduler může přepnout kontext. To je ale pořád čistě kooperativní.

Re:Naučení se asynchronnímu programování
« Odpověď #26 kdy: 07. 10. 2019, 17:21:50 »
Goroutiny nejsou korutiny. Korutiny běží v jednom vlákně.
Gorutiny taky, když máš jen jedno jádro. Je to úplně to samé, až na jedno písmenko.
Tohle je uz vylozene hnidopisstvi, ale nevim, jestli je dobry tvrdit, ze je to to same. Konceptualne ano, implementacne spis ne. Minimalne je rozdil v tom, ze goroutiny se muzou prepinat v ruzne okamziky (u soucasne implementace napriklad s kazdym volanim funkce AFAIK), zatimco u coroutin se predpoklada explicitni "spoluprace" programatora nejakym zpusobem typu yield apod.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #27 kdy: 07. 10. 2019, 17:26:03 »
Mel jsem matny pocit, ze jsem nekde cetl, ze s tim cosi v posledni dobe delali.
Mozna to bylo tohle https://github.com/golang/go/issues/24543 ? (Zatim?) jenom proposal.
Jo, to má milestone 1.14, první odklon od kooperativity.

Re:Naučení se asynchronnímu programování
« Odpověď #28 kdy: 07. 10. 2019, 17:26:39 »
akorát to teda nijak nesouvisí se smyčkou událostí, jde jen o kooperativní scheduler
Myslel jsem to tak, ze vsechny tyhle srandy ve finale na nejnizsi urovni znamenaji to samy - rozkouskovani linearnio kodu na nejake chunky, kterym se v nejakem loopu postupne prideluje cas behu. Potencialne na vic jadrech/vlaknech, ale to na tom nic nemeni.

(to může napsat jen javascriptař, ten víc vláken nezná, ale o srandajazycích se snad nebavíme :) ).
No tak on to prave nezna ani Python, v tom je cast toho celyho pruseru :)

Ne ne, akorát přidali přepínání korutin i k volání funkcí
To jo, ale to uz bylo davno. Ted jsem koukal, ze Go 1.2.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Naučení se asynchronnímu programování
« Odpověď #29 kdy: 07. 10. 2019, 17:28:54 »
Goroutiny nejsou korutiny. Korutiny běží v jednom vlákně.
Gorutiny taky, když máš jen jedno jádro. Je to úplně to samé, až na jedno písmenko.
Tohle je uz vylozene hnidopisstvi, ale nevim, jestli je dobry tvrdit, ze je to to same. Konceptualne ano, implementacne spis ne. Minimalne je rozdil v tom, ze goroutiny se muzou prepinat v ruzne okamziky (u soucasne implementace napriklad s kazdym volanim funkce AFAIK), zatimco u coroutin se predpoklada explicitni "spoluprace" programatora nejakym zpusobem typu yield apod.
Právěže to je shodné implementačně, třeba zrovna v C# funguje scheduler úplně stejně.