Precetl jsem asi 20 tutorialu na korutiny v Pythonu, ale doted jsem to nepochopil. Tedy pochopil jsem ty tutorialy, ale mam pocit, ze vsechny jsou psane dost blbe pomoci prikladu s asyncio.sleep (nebo nejspis je to proste copy paste :) ), coz je sice pochopitelne - ted budu spat a jina korutina muze delat nejakou praci, nez se zase probudim a budu neco delat ja, ale uz nikde neni priklad, kdy misto asyncio.sleep je nejaka skutecne blokujici funkce (napriklad ten dlouho trvajici vypocet). Pokud neco takoveho pridam, tak vlastne uz vsechny korutiny bezi opet synchronne, abych dosahnul nejake konkurence, tak kazdou musim spustit ve zvlastnim threadu, takze vlastne uplne nerozumim tomu, k cemu je to dobre.
Jak píše Calculon - pokud se jedná o program, ve kterém je hodně I/O operací (třeba dotazy do DB, HTTP ve stylu dotaz-odpověď), tak se hodí použít korutiny (https://www.root.cz/clanky/soubezne-a-paralelne-bezici-ulohy-naprogramovane-v-pythonu-2/#k09). K tomu asi dodám tři věci:
1. ten asyncio.sleep je prostě to nejjednodušš, čím je možné simulovat práci. Ale stačí to nahradit třeba za ty HTTP dotazy (https://www.root.cz/clanky/soubezne-a-paralelne-bezici-ulohy-naprogramovane-v-pythonu-2/#k18)
2. Korutiny mají dost velké množství výhod. Třeba se vůbec nemusí řešit přístup ke stejným objektům - žádné pokusy o transakce, mutexy atd. Úlohy totiž běží souběžně, ale současně i kooperativně, takže vývojář ví (měl by vědět) co přesně dělá.
3. Je tady ještě sémantický důvod. Například generátor typu range se dá typicky vytvořit korutinou, stačí použít yield (bez asyncio), což mi připadá jako zdaleka nejčistší řešení.
re "abych dosahnul nejake konkurence" - nerad opravuji v diskuzi, ale concurrent je souběžnost a ne paralelnost. Já vím, ono se to někdy používá jako synonymum, ale právěže tomu tak vůbec není. Korutiny umožňují tvorbu souběžného kódu (klidně v jednom vláknu), ne nutně paralelně běžící - to je totiž vyšší level (za který programátor musí zaplatit).
No, ono tady je problém, že async IO nejsou korutiny. Async IO je jenom a pouze o tom, že plnotučné (kernelové) vlákno není blokováno IO. Takže můžete mít souběžně několik IO operací v jednom vláknu.
No a toto právě dalo smysl do té doby (resp. se synchronním IO) "nesmyslným" korutinám. Protože pokud je hodně IO operací (typicky networking), tak díky async IO (a přepnutí korutiny při IO, místo zablokování celého vlákna, dokud se IO nedokončí) se z korutin stávají (v podstatě) souběžně běžící vlákna (protože ty IO operace opravdu běží souběžně).
Mimochodem korutiny v async IO prostředí běžně běží paralelně (v threadpoolu).
Dnes uz neni moc velky rozdil mezi asyncio a temi jmenovanymi knihovnami, nova dokumentace k asyncio je celkem dobra, ale problem je, ze k asyncio existuje spousta zastaralych tutorialu.
Zejmena Curio ma peknou dokumentaci doplnenou Davidovymi prednaskami.
upresneni: ten predchozi komentar je muj z mobilniho uctu
23. 3. 2022, 18:22 editováno autorem komentáře
No právě. Pochopit to nemám problém, ale používat v Pythonu :D.
Třeba v .NETu F# -- no problem. Kde ale nemám zcela jasno,
je v jakých vrstvách to má a nemá smysl. V doménové zcela určitě ne.
V servisní/integrační tam zcela jistě jo, pak ale najít tu správnou míru.
24. 3. 2022, 08:25 editováno autorem komentáře
Jo promiň, to je slovník z Domain-Driven Design. V doménové vrstvě není žádné IO, jen čisté struktury a funkce (objekty, metody). Ale můžou tam být i zdlouhavé výpočty, pak by tam asynchronost měla smysl (třeba právě v tom kryptu? nevím). V praxi se to ale většinou tak neobjevuje. V servisní nebo integrační vrstvě, kde už se komunikuje se světem bych to využil. Ale zase pro jednoduchost, otevřu DB provedu příkaz a pokud to netrvá dlouho, tak radši programuju prostě blokujícím způsobem..