Portál AbcLinuxu, 1. května 2025 07:22
V mojom príklade memcache používa skutočne blokujúce sockety (nepoužíl som gevent.monkey.patch_socket).
Pojem non blocking io sa používa hlavne v súvislosti s node.js ale je to prakticky to isté, čo som ukázal v python kóde (to je ekvivalentné s kooperatívnym multitaskingom kde sa pri volaní i/o prepne úloha a obnoví sa znovu až keď budú buffery patrične naplnené). Rozdiel je len v tom, že v pythone sa to isté dá zapísať bez callbackov.
Cieľom blogu bolo ukázať, že to, čo je dnes akože novinka tu bolo dávno pred tým, len sa to volalo trochu inak.
Prepínanie úlohy pri I/O sa dá dosiahnuť rôznymi spôsobmi - systémové vlákna, nejaké pseudovlákna v interpretovanom jazyku, alebo eventmi riadený loop s callbackmi ako v node.js. Rozdiel je len v spôsobe zápisu (ktorý je v prípade node.js podstatne zložitejší).
Samozreme teraz nehovorím, že rýchlo prepíšme všetko do pythonu pretože tam oproti node.js nie sú knižnice na neblokujúce volania pripravené. Príkladom môže byť napr. memcache, ktorý by pri nahradení socketu neblokujúcimi socketmi spôsobil odpojenie od memcached servera. Súčasné riešenie ktoré som ukázal pracuje s memcache korektne tj. požiadavka, odpoveď, požiadavka, odpoveď
na tom istom sockete. Ak by som povolil prerušenie dvojíc požiadavka - odpoveď dostal by som na tom istom sockete požiadavka, požiadavka ... chyba
. Tu je potrebné teda použiť špeciálnu memcache knižnicu, ktorá obaľuje dvojice do synchronizačných primitív a aby to celé nefungovalo ako úzke hrdlo treba vytvoriť niekoľko spojení a používať connection poll.
Pojem non blocking io sa používa hlavne v súvislosti s node.jsTen pojem se používal v době, kdy o node.js ještě nikdo neslyšel.
Áno, akurát v poslednej dobe sa z toho stal taký buzzword. Ako som písal všetko tu už bolo dávno, neblokujúce IO sa riešili väčšinou vláknami a to že v nodejs funguje tak, že IO operácie okamžite vracajú undefined a vrtátená hodnota IO sa podstrčí callbacku je len obídenie obmedzení nodejs, žiadna zázračná technológia. To isté som ukázal v inom jazyku (konkrétne python, ale kľudne som mohol použiť čokoľvek iné, čo pozná vlákna) ale s jednoduchším a kratším kódom (vďaka tomu, že sa nemusia používať callbacky). Takže podčiarknuté a sčítané - node.js sa oplatí jedine vďaka knižniciam, ale samotný komfort pri písaní a čitateľnosť kódu tu netreba hľadať.
Áno, akurát v poslednej dobe sa z toho stal taký buzzword.Buzzwordy si nech pro personalistky a management.
Ako som písal všetko tu už bolo dávno, neblokujúce IO sa riešili väčšinou vláknamiVzhledem k tomu, že neblokující IO, tak jak je známý z POSIXových a podobných systémů, je v podstatě jedinou možností, jak se vláknům (či procesům) vyhnout, zní mi tato věta dost komicky. Jediné, co ti můžu doporučit je přestat se snažit o vysvětlení a něco si o tom přečíst. Třeba na anglickou wikipedii ta tvoje buzzwordová verze ještě nedošla. Já jsem srozuměn s tím, že za „neblokující“ se dá označit ledacos včetně toho vláknování, ale pod „neblokujícím IO“ si představuju neblokující vstupní a výstupní operace. A to jsou kupodivu IO operace, které neblokují proces (vlákno), které je spustilo. Alternativou k tomu je spuštění blokující operace v samostatném vlákně. Jenže to musí být skutečné vlákno operačního systému, jinak nelze vůbec samostatně ze strany OS zablokovat. Takže pokud se jedná o nějaká kooperativní falešná vlákna na úrovni bajtkódových instrukcí (tak jsem to ze zápisku pochopil), tak za tím bude mezivrstva, která používá právě neblokující IO operace.
V prípade pythonu je to skutočne kooperatívny multitasking a na asynchrónne operácie sa používa knižnica libev (v tomto konkrétnom prípade, neplatí všeobecne).
> [1, 2, 3, 10].sort() [1, 10, 2, 3]Tohle jinde nenajdeš
import vibe.d; import memcache; shared static this() { auto memcache = new Memcache("127.0.0.1:11211"); memcache.set("msg_var", "vyrok_2013-07-12"); memcache.set("vyrok_2013-07-12", "vyrok pre dnesok"); auto settings = new HTTPServerSettings; settings.bindAddresses = ["::1", "127.0.0.1"]; settings.port = 8080; listenHTTP(settings, (HTTPServerRequest req, HTTPServerResponse res) { auto msg_var = memcache.get("msg_var"); auto msg = memcache.get(msg_var); res.writeBody(msg, "text/plain"); }); }BTW. je to skoro 2x rychlejsi nez node.js
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.