Portál AbcLinuxu, 3. září 2026 00:16
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.
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.
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.
Tiskni
Sdílej:
Myšlienka je nehanebne vykradnutá z Java virtual threads. Nerád to priznávam, ale Java predsalen niečo urobila dobre. Alebo som už starý a väčšina mozgových buniek mi už odumrela a preto tajne obdivujem Javu. Videl som snahu o await anywhere, čo by problém do istej miery riešilo - cpython-await-anywhere. No a nakoniec existuje ešte celá veľká diskusia o virtual threads.
Tie farby sú hlavne v Djagngo problém a nadávam na to od rána do večera. Transakcie s tým nefungujú. Všetky async db funkcie sú implementované tak, že sa spúšťajú synchrónne v jednom vlákne s neskutočnou réžiou jedného async volania okolo 1ms. Nie je to rýchlejšie ani o chlp a všetko okolo je proste nepodarený vtip. Stackless, twisted aj gevent poznám. Geventu som tak trocha držal palce, že nektoré myšlienky by mohli byť zapracované (ale nie ako monkey patch).
Tie farby sú hlavne v Djagngo problém a nadávam na to od rána do večera. Transakcie s tým nefungujú. Všetky async db funkcie sú implementované tak, že sa spúšťajú synchrónne v jednom vlákne s neskutočnou réžiou jedného async volania okolo 1ms. Nie je to rýchlejšie ani o chlp a všetko okolo je proste nepodarený vtip.Jo, já vím. Taky mám jeden sync kód kde tohle musím volat pro každý uživatelský požadavek (flask) na grpc service, protože ten tým co píše tu service zveřejňuje jen async balík a je to fakt oser. U nás jedem všechno sync + mutltithreading / multiprocessing, tak nějak to dělá můj život snažším, i když to má pár nevýhod. Co mě zaráží je kolik lídí v mém okolí často přijde s tím že "pojďme to přepsat na async, bude to lepší" a pak nejsou schopni odpovědět jak. Lehce unrelated; nedávno někdo posílal https://github.com/Dicklesworthstone/asupersync, to vypadá docela cool. Ještě mnohem víc unrelated a cool: Tohle doporučuji Computer System Organization: The B5700/B6700 Series, je to docela krátké a překvapivě relevantní i dneska. Čuměl jsem jak moc z toho používáme a byl překvapen jak moc ne, hlavně co se týče paralelizace a synchronizace procesů.
Dik za linky, pozriem si.
Nemám kolegov, s ktorými by som preberal takéto technické veci, ale keď vidím v internetových diskusiách ako všetci nadšene tlieskajú nápadom prepíšme to všetko do async tak len krútim hlavou. Ľudia nechápu tomu, čo je kooperatívny multitasking a ako málo sa z toho dá vyťažiť ak práve nerobia náhodou multi user chat s tisícmi aktívnych websocket spojení, lenže to je niečo dosť špecifické.
V dobe AI aj súhlasím, že Java je dobrá. V dobe pred AI som silne preferoval jazyky, ktoré umožňujú jednoducho špinavým spôsobom implementovať veľa na málo riadkoch kódu. Ľahšie sa to píše a hlavne ľahšie sa to číta. Návrhové vzory? Meh. Singleton? Meh, bac niečo do modulu. Ochrana? Meh. Sme dospelí. Až sa budem hrať so zápalkami viem čo sa stane. Teraz väčšina ľudí mávne rukou nad riadkami. Keď niekedy prepisujem 50-riadkový AI python kód na 20 riadkový pripadám si ako dinosaurus. Na rozdiel od samotného jazyka Java mám Java VM veľmi rád a myslím, že je celkom lightweight. Taktiež memory overhead nie je tak hrozný keď si človek uvedomí, že typické C po mallocu a free fragmentuje.
Dať to agentovi to neviem, lebo neviem, čo je cieľ. Chcem čitateľný krátky nie overengineered kód, ale agent nerozumie. Agent spraví. Ja nerozumiem. Agent ukecaný. Ja nie. Ja priamy. Hack hack done.
Cieľ je aby to vedel zmeniť / opraviť / prečítať človek. Vidím zložitý algoritmus a myslím, že nemusí byť zložitý. Prepíšem ho. Okrem toho väčšinou píšem v pythone takže málo balastu a väčšinou mi ručný zásah zaberie menej času než vysvetľovať čo presne chcem.
s/Java/Python/gTakhle se právě programuje v Pythonu – výkonný kód je v nativních knihovnách, často nepřenositelný a křehký. A kód v Pythonu je jen vrstva lepidla nad tím. V Javě je naopak běžné implementovat knihovny v čisté Javě. Nativní se používají jen pro takové věci jako OpenGL nebo interakci s hardwarem. Ale i třeba kryptografii nebo síťové protokoly a de/kodéry formátů máš čistě v Javě (tzn. přehlednější a mj. bezpečnější než třeba nativní céčko).
Dělá se mi mdlo při představě v tom něco kódovat. Aplikace, která dotahuje jako závislost JRE je pro mě red flag.
Ten patla matla Žako není žádný linuxák. Jenom pták.
select.poll() rulez - stara skola - ziadne farby ani nic, proste to funguje. mam rad jednoduchy jednosluckovy kod nez sa hrabat v asynchronne beziacich funkciach, casto sa v tom clovek dokaze stratit ,-)
epoll() linux, alebo kqueue() bsd - dalsie triestenie ktore snad nikdy nepochopim. + select.select() - na tak zasadnej veci sa sa nedokazali dohodnut, kazdy kopiruje ale tuto dolezitu vec linux skopirovat nevedel. a najhorsie je to, ze tuto zakladnu vec vobec nereimplementovali priamo do klasickeho poll() ale musim riesit platformu na ktorej kompilujem alebo pouzivat kniznice ako selectors
select.poll má lineární složitost, takže už je desítky let lepší se mu vyhnout (např. použít epoll). Neschopnost místních "programátorů" mě nepřestává udivovat
select.poll() rulez - stara skola - ziadne farby ani nic, proste to funguje. mam rad jednoduchy jednosluckovy kod nez sa hrabat v asynchronne beziacich funkciach, casto sa v tom clovek dokaze stratit ,-)
Ale beze srandy, chápu, že už to pro tebe neni, tak prosím nenavrhuj jak se to má dělat teď, jo?
A taky ses tu svého času kasal, jak vyděláváš na WordPressu
Toto jednoduché rozšírenie pythonu prinieslo kooperatívny multitasking aj do starého kódu bez akejkoľvek nutnosti upraviť kód.Tohle mi přijde jako extrémně optimistické tvrzení. IMHO tenhle přístup obecně povede jen ke zvýšení latencí a bude potřeba celý kód přepsat. Pokud jseš ty, kdo rozhoduje o kontext switchi, tak prostě musíš zajistit, že nesedíš na CPU moc dlouho, jinak brzdíš ostatní. V synchronním kódu to za tebe řeší někdo jiný, ale v async kódu je to na tobě. Proto i když je to otravný, tak dává smysl funkce barvit, protože sémantika je jiná.
Tvrdenie nie je optimistické a reálny rozdiel nemusí byť merateľný. Kontrola na úrovni volania nemusí existovať. V momente keď posielam funkciu CooperativeThread môže python urobiť runtime špecializáciu funkcie (1 volania za celý beh programu), ktorý ju špecializuje na stackless / async so sémantikou kódu bez farbenia.
Ja som tu nebol ten, kto písal o latencii a výkone. Plne chápem, že async je pre mňa dobrý ak musím držať tisíce otvorených spojení a nemá to nič spoločné s výkonom. Toto mi vážne netreba vysvetľovať. Teraz píšem aplikáciu v async frameworku (FastAPI) a mám chuť niekoho nakopať za ten návrh. Všetko musím farbiť aj keď nikde reálne nedržím spojenia. Pretože niekto rozhodol, že async je lepší. Java s virtual threads to dokázala implementovať a čuduj sa svete nie nie je to 100x pomalšie než 1 sériové vlákno. Ak sa bavíme o výkone tak sa musíme baviť o implementácii, lebo výkon závisí od implementácie. Ak to bude implementované dobre, nebude to 100x pomalšie než 1 sériové vlákno. Rozdiel bude odhadom v jednotkách % oproti natívnom async.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.