Implementácia async v pythone z alternatívneho vesmíru

23.08 | 14:11 | Mirecove dristy | Miroslav Bendík

Už je to okrúhlych 10 rokov od kedy python má podporu asynchrónneho programovania. Tento článok z alternatívneho vesmíru nám ukáže ako mohol vyzerať python ak by sa vydal trocha inou cestou.

Už okolo roku 2010 začalo byť jasné, že budúcnosť webových aplikácií patrí dlho bežiacim socketom. Tradičné formy konkurentného behu ako procesy a vlákna boli pre tento účel príliš ťažké a tak sa oprášil starý koncept kooperatívneho multitaskingu používaný v operačných systémoch v minulom tisícročí.

Do úvahy sa brali rôzne alternatívy ako napríklad zavedenie kľúčových slov async a await, čo je inak povedané farbenie funkcií. V praxi by to znamenalo, že každá knižnica, každý kód, ktorý by mal podporovať súčasné blokujúce API a zároveň asynchrónne API by musel implementovať oba. Znamenalo by to duplikáciu kódu skoro celého python ekosystému a to nikto nechcel.

Väčšina sync / async funkcií sa v praxi líši len farbou a jedným volaním. Ak by sa python vydal touto cestou, určite by vznikli rôzne automatizované nástroje ako tento vtip menom unasync.

Určite by veľké frameworky ako Django mali problémy, ktoré by sa preberali v dlhých diskusiách.

Existovali by problémy s async property, pretože by nebolo možné sprístupniť ORM related model ako book.author ktorý by bol synchrónny alebo asynchrónny keď to, či pristupuje k databáze závisí od toho, či bol dotaz volaný so select_related (žiaden prístup), prefetch_related (prístup pri prvom objekte v iterácii), alebo prístup v každom objekte. Jednoducho s async / await by to bol veľký chaos, ktorý by roky trápil a rozdeľoval komunitu.

Ako funguje bez farbenia a nových kľúčových slov?

Každá blokujúca I/O operácia implementovaná v pythone má svoju sync a async variantu. Tá sa volí podľa kontextu, v ktorom je spustená.

Aby program bežal kooperatívne postačuje, aby kooperatívna časť bola spustená ako CooperativeThread. API zostáva kompatibilné so systémovými vláknami, ale spracovanie udalostí CooperativeThread sa uskutočňuje buď v implicitnom event-loope, alebo vo vlastnom loope explicitne poslanom konštruktoru CooperativeThread.

Toto jednoduché rozšírenie pythonu prinieslo kooperatívny multitasking aj do starého kódu bez akejkoľvek nutnosti upraviť kód. Knižnice sa stali automaticky kooperatívnymi v momente keď sa spustili v správnom kontexte. Netreba nič prepisovať, len doplniť malú časť do pythonu. Všetko ostatné je zadarmo.

Je toto vôbec legálne?

Ak sa pýtate, či je to v súlade s python Zen tak nie:

Explicit is better than implicit.

Niekedy si radšej zababrem ruky za lepšie riešenie než by som sa striktne držal pravidiel.

    • RE: Implementácia async v pythone z alternatívneho vesmíru 25.08 | 13:52
      Avatar Richard antiX  Používateľ

      Ale meh, tieto Zen filozofie. Napríklad kultúra Emacs Lispu je iná a spolieha sa viac na implicitnosť. A to nie preto, že by jeho užívatelia boli nekultúrni! 😀.

      Tam je základom moc! Tá je hodnotnejšia a viac ako jednoznačnosť. Typové konverzie sú implicitné a schované. Globálne premenné sú denným chlebom. Magické správanie je časté, očakávané a prijímané!

      Takže sa netreba hanbiť za takéto nečisté úmysly. Máme ich všetci. 😀

    • RE: Implementácia async v pythone z alternatívneho vesmíru 28.08 | 08:29
      Avatar redhawk1975 Windows 11 nonsystemd edition  Používateľ

      pekne.

       

      my co nie sme koderi, nam staci arduino ide a LLM

      Do or do not. There is to no try.​ Když pohřbíš moc tajemství, na hřbitově dojde místo.