Implementácia async v pythone z alternatívneho vesmíru
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.

Pre pridávanie komentárov sa musíte prihlásiť.