abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 14:33 | Humor

    Copilot automaticky vkládal do pull requestů 'propagační tipy', reklamní text se na GitHubu objevil ve více než jedenácti tisících pull requestech. Po vlně kritiky byla tato funkce zablokována a produktový manažer Tim Rogers připustil, že umožnit Copilotovi upravovat cizí pull requesty bez vědomí autorů byla chyba.

    NUKE GAZA! 🎆 | Komentářů: 4
    dnes 12:55 | Upozornění

    Je 31. března a tedy Světový den zálohování (World Backup Day). Co by se stalo, kdyby Vám právě teď odešel počítač, tablet nebo telefon, který používáte?

    Ladislav Hagara | Komentářů: 3
    dnes 12:44 | Upozornění

    Digitální a informační agentura (DIA) přistupuje ke změně formátu důvěryhodného seznamu České republiky z verze TLv5 na verzi TLv6, která nastane 29. dubna 2026 v 00:00 (CET). Ke změně formátu důvěryhodných seznamů členských států (tzv. Trusted Lists) dochází na základě změn příslušné unijní legislativy. Důvěryhodné seznamy se používají v rámci informačních systémů a aplikací zejména pro účely ověřování platnosti elektronických

    … více »
    Ladislav Hagara | Komentářů: 2
    dnes 05:00 | Nová verze

    Rspamd (Wikipedie), tj. open source systému pro filtrování nevyžádané pošty, byl vydán v nové major verzi 4.0.0. Přehled novinek v Changelogu.

    Ladislav Hagara | Komentářů: 1
    včera 23:11 | Nová verze

    SolveSpace (Wikipedie), tj. multiplatformní open source parametrický 2D/3D CAD, byl vydán v nové verzi 3.2. Přehled novinek v Changelogu na GitHubu. Vyzkoušet lze novou oficiální webovou verzi.

    Ladislav Hagara | Komentářů: 7
    včera 18:22 | Pozvánky

    Organizátoři Dne IPv6, tradiční akce věnované tématům spojeným s tímto protokolem, vyhlásili Call for Abstracts. Na webu konference mohou zájemci přihlašovat příspěvky o délce 20 nebo 40 minut či 10minutové lighting talky a to až do 30. dubna. Tvůrci programu uvítají návrhy přednášek z akademického i komerčního sektoru, které mohou být technického i netechnického zaměření. Den IPv6 se letos uskuteční 4. června a místem konání bude i

    … více »
    VSladek | Komentářů: 12
    včera 15:00 | Zajímavý software

    Euro-Office (Wikipedie) je evropský fork open source kancelářského balíku OnlyOffice. Za forkem stojí koalice firem IONOS, Nextcloud, Eurostack, XWiki, OpenProject, Soverin, Abilian a BTactic. Cílem je zajistit digitální suverenitu Evropy a snížit závislost na neevropských platformách. Projekt vznikl mimo jiné v reakci na nedávné uzavření cloudové služby OnlyOffice. OnlyOffice obviňuje Euro-Office z porušení licenčních podmínek. Na možné problémy upozorňuje i Collabora Online. Jednostranná změna licence není v pořádku.

    Ladislav Hagara | Komentářů: 27
    včera 05:11 | Komunita

    Byly zpracovány a na YouTube zveřejněny videozáznamy jednotlivých přednášek z letošního Installfestu.

    Ladislav Hagara | Komentářů: 0
    včera 00:22 | Komunita

    Během akce Arduino Days 2026 byl publikován Arduino Open Source Report 2025 (pdf) a oznámeno 7 nových produktů kompatibilních s deskou UNO Q (Arduino USB-C Power Supply, USB-C Cable, USB-C Hub, UNO Media Carrier, UNO Breakout Carrier, Bug Hopper, Modulino LED Matrix).

    Ladislav Hagara | Komentářů: 1
    29.3. 20:22 | IT novinky

    Google v pátek spustil v Česku Vyhledávání Live. Tato novinka umožňuje lidem vést plynulou konverzaci s vyhledávačem v češtině. A to prostřednictvím hlasu, nebo prostřednictvím toho, na co ukážou svým fotoaparátem či kamerou v mobilu. Rozšíření této multimodální funkce je možné díky nasazení Gemini 3.1 Flash Live, nového hlasového a audio modelu, který je od základu vícejazyčný, takže umožňuje lidem po celém světě mluvit na vyhledávač přirozeně a v jazyce, který je jim nejbližší.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (14%)
     (23%)
    Celkem 1196 hlasů
     Komentářů: 29, poslední dnes 11:17
    Rozcestník

    Non blocking IO vs kooperatívny multitasking na webe

    7.12.2013 19:50 | Přečteno: 2744× | Web | poslední úprava: 7.12.2013 19:47

    V poslednej dobe sa dosť často hovorí o javascripte na serveri (node.js). Jeho súčasťou je non blocking IO čo sa využíva prevažne v realtimových webových aplikáciách. V tomto blogu sa pozrieme na pomerne starú alternatívu k non blocking io - kooperatívny multitasking.

    Príklad

    V dnešnom príklade budeme chcieť vypísať výrok dňa. Ten bude uložený v memcache. Aby to nebolo tak jednoduché pre každý deň bude citát v samostatnej premennej a jej názov nájdeme taktiež v memcache v premennej msg_var.

    Nodejs

    var http = require('http');
    var Memcached = require('memcached');
    var memcached = new Memcached('127.0.0.1:11211'); // pripojenie na memcache
    
    // Nastavenie premenných, toto by mal riešiť externý skript
    memcached.set("msg_var", "vyrok_2013-07-12")
    memcached.set("vyrok_2013-07-12", "vyrok pre dnesok")
    
    http.createServer(function (req, res) {
      // IO operácia - načítanie msg var
      memcached.get('msg_var', function(err, msg_var) {
        // callback po načítaní msg_var
        if (err) {
          sys.puts('Error!');
          return;
        }
        // IO operácia - načítanie konkrétneho výroku
        memcached.get(msg_var, function(err, msg) {
          if (err) {
            sys.puts('Error!');
            return;
          }
          res.writeHead(200, {'Content-Type': 'text/plain'});
          res.end(msg); // výpis výroku
        });
      });
    }).listen(8888, '127.0.0.1');
    

    Pre spustenie musíme nainštalovať memcache (npm install memcached), spustiť memcached server (pomocou obľúbeného init systému) a spustiť node server (node server.js).

    gevent

    from gevent.wsgi import WSGIServer
    import umemcache as memcache
    
    mc = memcache.Client('127.0.0.1:11211')
    mc.connect()
    mc.set("msg_var", "vyrok_2013-07-12")
    mc.set("vyrok_2013-07-12", "vyrok pre dnesok")
    
    def application(environ, start_response):
    	start_response("200 OK", [('Content-Type', 'text/plain')])
    	msg_var = mc.get("msg_var")[0]
    	msg = mc.get(msg_var)[0]
    	yield msg
    
    WSGIServer(('127.0.0.1', 8888), application, log=None).serve_forever()
    

    Pre spustenie musíme nainštalovať závislosti umemcache a gevent (pomocou easy_install alebo pip) Server sa spustí príkazom python server.py.

    Výsledky

    Pre oba servery bolo vypálených 10 000 požiadaviek pričom paralelne bolo udržiavaných 100 spojení (ab2 -n 10000 -c 100 127.0.0.1:8888).

    Node:

    Concurrency Level:      100
    Time taken for tests:   16.881 seconds
    Complete requests:      10000
    Failed requests:        0
    Write errors:           0
    Total transferred:      1180000 bytes
    HTML transferred:       170000 bytes
    Requests per second:    592.38 [#/sec] (mean)
    Time per request:       168.811 [ms] (mean)
    Time per request:       1.688 [ms] (mean, across all concurrent requests)
    Transfer rate:          68.26 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   3.1      0      46
    Processing:    20  168  65.8    179     413
    Waiting:       19  168  65.7    179     412
    Total:         65  168  65.9    179     413
    
    Percentage of the requests served within a certain time (ms)
      50%    179
      66%    204
      75%    216
      80%    220
      90%    254
      95%    281
      98%    303
      99%    389
     100%    413 (longest request)

    gevent:

    Concurrency Level:      100
    Time taken for tests:   19.746 seconds
    Complete requests:      10000
    Failed requests:        0
    Write errors:           0
    Total transferred:      1180000 bytes
    HTML transferred:       170000 bytes
    Requests per second:    506.42 [#/sec] (mean)
    Time per request:       197.464 [ms] (mean)
    Time per request:       1.975 [ms] (mean, across all concurrent requests)
    Transfer rate:          58.36 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   1.6      0      24
    Processing:    16  196  13.9    197     219
    Waiting:       15  196  13.9    197     219
    Total:         32  196  12.7    198     219
    
    Percentage of the requests served within a certain time (ms)
      50%    198
      66%    201
      75%    203
      80%    204
      90%    207
      95%    209
      98%    211
      99%    212
     100%    219 (longest request)
    

    Vyhodnotenie

    Kód s non blocking io je prakticky ekvivalentný python kódu s geventmi. Rozdiel v počte riadkov a zložitosti kódu je úplne jasný. Preto pre node.js vznikajú knižnice, ktoré umožňujú zapisovať trochu rozumnejšie (async).

    Rozdiel vo výkone bol pomerne malý - 592.38 requestov za sekundu v prípade node.js proti 506.42 v pythone s knižnicou gevent. Rozdiel by bol o niečo menší ak by bol použitý python s jit (pypy) a v prípade použitia memcache knižnice s lepšou implementáciou socketov bol by python o kúsok vpredu.

    Non blocking io neprináša oproti kooperatívnemu multitaskingu žiadne výhody, len výrazne zneprehľadnenie kódu. Na druhej strane python nemá knižnice pripravené na to, aby plne využívali kooperatívny multitasking. To je jediný rozumný dôvod prečo zvoliť nodejs pred pythonom.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    pavlix avatar 8.12.2013 09:43 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    Ověřoval jsi vůbec, zda gevent používá blokující IO, abys mohl tvrdit, že je lepší používat gevent než neblokující IO?

    Tvrzení, že neblokující IO kód znepřehledňuje je pitomost. Dobře udělané Pythoní API musí být schopné jakýkoli boilerplate kód schovat.

    Ovšem hlavní smysl neblokujícího IO je paradoxně blokování. Přesněji řečeno blokování na celé řadě souborových deskriptorů namísto blokování samotných operací nad deskriptory.

    Alternativou k neblokujícímu IO je pro každou takovou akci založit nové vlákno či proces. Jestliže se používá nějaký interní multitasking, bez kernelových vláken, tak musí daný framework zabránit kernelu, aby kvůli jednomu pseudovláknu zablokoval celé pythoní vlákno se všemi pseudovlákny. K tomu se používá neblokující IO.

    Nepleť si pojmy s dojmy a zkus si uvědomit, že neblokující IO je to, na čem obě srovnávané varianty stojí.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    mirec avatar 8.12.2013 10:04 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe

    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.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    pavlix avatar 9.12.2013 07:34 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    Pojem non blocking io sa používa hlavne v súvislosti s node.js
    Ten pojem se používal v době, kdy o node.js ještě nikdo neslyšel.

    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    mirec avatar 9.12.2013 07:48 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe

    Á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ť.

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    pavlix avatar 9.12.2013 08:34 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    Á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áknami
    Vzhledem 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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    mirec avatar 9.12.2013 11:24 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe

    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).

    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    pavlix avatar 9.12.2013 13:26 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    To zní jako rozumné řešení, libev je jedna z knihoven na event loop pro neblokující IO.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    9.12.2013 09:07 Mike
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    Ano, také nechápu proč někdo používá node.js a píše v prasáckém Javascriptu, když jsou tu mnohem lepší nástroje např. právě v podobě Pythonu + gevent.

    Podle mě jsou to přeučení webaři zvyklí v Javascriptu prasit client-side, co nic jiného než JS pořádně neumí, tak se ho drží zuby nehty i na straně serveru. A nebo obzvláště zvrácení masochisti, jiné vysvětlení nemám.
    9.12.2013 16:29 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    > [1, 2, 3, 10].sort()
    [1, 10, 2, 3]
    
    Tohle jinde nenajdeš ;-).
    When your hammer is C++, everything begins to look like a thumb.
    10.12.2013 16:37 Kozzi
    Rozbalit Rozbalit vše Re: Non blocking IO vs kooperatívny multitasking na webe
    Tak ono to jde pomoci asynchroniho I/O a nemusi to vypadat zle):
    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

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.