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í
×

19.1. 18:55 | Komunita

NHSbuntu (Joinup, prezentace) měla být z Ubuntu vycházející linuxová distribuce přizpůsobená pro potřeby britské Národní zdravotní služby (NHS). NHS se název nelíbil, nejednalo se o oficiální projekt NHS, a proto bylo NHSbuntu v září loňského roku přejmenováno na NHoS. Vývojáři NHoS tento týden oznámili, že NHS se nelíbí ani název NHoS a už nemají sílu na další přejmenování a pokračování v projektu. Dodávají, že několik jednání s vedením

… více »
Ladislav Hagara | Komentářů: 2
19.1. 18:44 | Pozvánky

Koncem ledna, 29. 1. 2018 od 17 do 20 hodin se v Akademii CZ.NIC uskuteční večer s Turrisem.

Co bude na programu?… více »
Miška | Komentářů: 3
19.1. 18:33 | Pozvánky

Na tri dni sa hlavné mesto Slovenska po tretíkrát zmení na miesto s najväčšou koncentráciou profesionálnych programátorov, systémových administrátorov, učiteľov informatiky aj technologických nadšencov. Hlavným lákadlom bude konferencia PyCon SK 2018, určená záujemcom o Python, jeden z najpopulárnejších programovacích jazykov na svete.

… více »
RicCo386 | Komentářů: 1
19.1. 18:22 | Pozvánky

Letošní ročník konference Prague PostgreSQL Developer Day se koná ve dnech 14. 2. a 15. 2. 2018. Zveřejněn byl program s přednáškami a školeními. Otevřena byla také registrace na konferenci.

TomasVondra | Komentářů: 0
19.1. 11:33 | Komunita

Společnost Canonical stojící za linuxovou distribucí Ubuntu oznámila dostupnost nástroje pro týmovou spolupráci Slack (Wikipedie) ve formátu snap. Instalovat jej lze ze Snapcraftu. Slack pro Linux je dostupný také ve formátu klasických balíčků pro Ubuntu a Fedoru.

Ladislav Hagara | Komentářů: 9
18.1. 17:33 | Nová verze

Po roce vývoje od vydání verze 2.0 a 6 000 změnách byla vydána nová stabilní verze 3.0 softwaru, který vytváří aplikační rozhraní umožňující chod aplikací pro Microsoft Windows také pod GNU/Linuxem, Wine (Wikipedie). Z novinek lze zdůraznit například podporu Direct3D 10 a 11. Podrobnosti v poznámkách k vydání.

Ladislav Hagara | Komentářů: 14
18.1. 13:44 | Zajímavý projekt

V říjnu loňského roku úspěšně skončila kampaň na podporu chytrého telefonu Librem 5, jenž by měl respektovat bezpečnost, svobodu a soukromí uživatelů. Společnost Purism informuje o aktuálním vývoji tohoto telefonu. Místo plánovaného SoC i.MX6 by měl být použit úspornější i.MX8.

Ladislav Hagara | Komentářů: 4
18.1. 12:33 | Zajímavý projekt

V květnu loňského roku měl na YouTube premiéru krátký animovaný film Agent 327: Operation Barbershop. Blender Animation Studio včera zveřejnilo alternativní konec tohoto filmu.

Ladislav Hagara | Komentářů: 0
18.1. 05:55 | Bezpečnostní upozornění

Společnost Oracle vydala čtvrtletní bezpečnostní aktualizaci svých softwarových produktů (CPU, Critical Patch Update). Opraveno bylo celkově 237 bezpečnostních chyb. V Oracle Java SE je například opraveno 21 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 18 z nich. V Oracle MySQL je opraveno 25 bezpečnostních chyb. Vzdáleně zneužitelných bez autentizace je 6 z nich.

Ladislav Hagara | Komentářů: 0
17.1. 20:55 | Komunita

Linux ve VirtualBoxu nebude potřebovat Přídavky pro hosta (Guest Additions). Budou součástí linuxového jádra. Ovladač vboxguest by se měl dostat do Linuxu 4.16. Ovladač vboxsf by měl následovat.

Ladislav Hagara | Komentářů: 27
Jak se vás potenciálně dotkne trend odstraňování analogového audio konektoru typu 3,5mm jack z „chytrých telefonů“?
 (7%)
 (1%)
 (1%)
 (1%)
 (77%)
 (13%)
Celkem 1349 hlasů
 Komentářů: 53, poslední 17.1. 16:55
    Rozcestník

    Co nás ph naučil 3: actor model

    2.1.2017 10:07 | Přečteno: 1433× | Jen tak | Výběrový blog

    V prvním a druhémzápisku jsem nastínil technické věci, jako coding conventions a generování projektů. To jsou poměrně nudné a nezajímavé veci. Na řadě je tedy actor model.

    Problém: You must be this tall to write multithreaded code

    Actor model je způsob práce s "konkurentním" (concurrent) během kódu. Mimochodem první paper byl publikovaný v roce 1973, takže se nejedná o nijak novou věc.

    Klasické postupy programování končí u procesů, nebo vláken, zamykání, semaforů, mutexů, sdílené paměti a podobně. A jako takové vede ke spoustě záludných chyb a deadlocků a velice obtížně odhalitelných problémů při běhu vašeho kódu. A až všechno odladíte pro 4 jádra, někdo váš kód spustí na 8.

    Tohle všechno je rozepsáno v Scalable C: Problem: is my code thread-safe?, The Architecture of OpenSource applications: 24.8. Concurrency Model.

    Actor model znamená, že je program modelován jako jeden, či více nezávislých aktorů. Ty mezi sebou mohou komunikovat pouze pomocí posílání zpráv. Jeden actor pak může spustit a kontrolovat vícero actorů.

    Tento model, mimochodem, je model jazyka Erlang/Elixir, který se používání na psaní vysoce škálovatelného software.

    Třída zactor

    Pro jazyky, které actor model nepodporují v základu, existují knihovny. V případě czmq existuje třída zactor, která využívá zeromq sockety a funkce pro kontrolu actorů.
    #include <czmq.h>
    
    static void
    s_actor1 (zsock_t *pipe, void *args)
    {
        char *name = strdup (args);
        zsock_signal (pipe, 0);
        for (int i = 0; i != 10; i++)
            zsys_info ("%s:\tcount %d\n", name, i);
        zstr_free (&name);
    }
    
    int main () {
        zactor_t *actor = zactor_new (s_actor1, "actor1");
        while (true) {
            char *str = zstr_recv (actor);
            if (str) {
                puts (str);
                zstr_free (&str);
            }
            else
                break;
        }
    
        zactor_destroy (&actor);
    }
    
    Každý actor funkce očekává dva parametry, zeromq socket a void ukazatel na případná další data. Obvykle se args nevyplatí používat a pokud, tak na něco jako log_prefix. Rozhodně není dobrý nápad takto předávat třeba zeromq sockety. Technicky totiž actor běží v jiném vlákně. Parametr pipe je potom EXPAIR socket, který což je v podstatě obousměrná asynchronní roura. Ta funguje přes inproc transport, takže všechny funkce send/recv pouze předávají ukazatele mezi vlákny. Výhodou je, že tyto funkce akceptují actor, zeromq socket, nebo pipe. Takže je používání konzistentní ze všech stran. Třída zactor má velmi jednoduchý protokol, actor samotný musí oznámit pomocí zsys_signal, že dokončil inicializaci a může zpracovávat zprávy. Druhým požadavkem je, že actor musí číst ze svého socketu a v případě příkazu $TERM se ukončit.

    Jak ukončit program

    Kdo si program vyzkoušel, přišel na to, že vypíše čísla 1-10 a pořád běží. To není chyba, ale vlastnost. Zeromq se obvykle používá na psaní server side kódu, který běží pořád a je to náš příklad, který nedává moc smysl. Ale tady se ukazuje flexibilita actore modelu, prostě po ukončení výpočtu pošleme příkaz $DONE, kterým actor oznámí to, že dokončil práci. A hlavní vlákno si to přečte a actora ukončí.
    #include <czmq.h>
    
    static void
    s_actor1 (zsock_t *pipe, void *args)
    {
        char *name = strdup (args);
        zsock_signal (pipe, 0);
        for (int i = 0; i != 10; i++)
            zsys_info ("%s:\tcount %d\n", name, i);
        zstr_send (pipe, "$DONE");
        zstr_free (&name);
    }
    čte a 
    int main () {
    
    ....
        char *str = zstr_recv (actor);
        if (str && streq (str, "$DONE"))
            break;
    
    A tady vidíme flexibilitu třídy zactor, knihovny zeromq a posílání zpráv. Je triviální zajistit komunikaci mezi hlavním vláknem a actory.

    Jak poslat data do actoru

    static void
    s_actor1 (zsock_t *pipe, void *args)
    {
        zsock_signal (pipe, 0);
        zpoller_t *poller = zpoller_new (pipe, NULL);
    
        while (!zsys_interrupted) {
            void *which = zpoller_wait (poller, -1);
            if (!which)
                break;
    
            zmsg_t *msg = zmsg_recv (pipe);
            char *cmd = zmsg_popstr (msg);
            if (!cmd || streq (cmd, "$TERM")) {
                zmsg_destroy (&msg);
                zstr_free (&cmd);
                break;
            }
            else
            if (streq (cmd, "COUNT")) {
                char *smax = zmsg_popstr (msg);
                int max = atoi (smax);
                for (int i = 0; i != max; i++)
                    zsys_info ("count %d", i);
                zstr_send (pipe, "$END");
            }
            zmsg_destroy (&msg);
            zstr_free (&cmd);
        }
        zpoller_destroy (&poller);
    }
    
    ...
    int main () {
        zactor_t *actor = zactor_new (s_actor1, NULL);
        zstr_sendx (actor, "COUNT", "42", NULL);
    
    Posílání dat do actoru je snadné. Funkce zstr_sendx odešle zprávu s vícero rámci (frame), která bude předána actoru. V těle actoru je zpráva zpracována a provedena. Typický actor ovšem nekomunikuje pouze ze svým socketem pipe, ale obvykle má otevřených vícero socketů, které mpořebuje číst. Na tohle se hodí další třída zpoller, která čeká tak dlouho, než se na jednom ze sledovaných socketů neobjeví data, která je možné číst.

    Ale k čemu je to vlastně dobré?

    Zatím se zdá, že actor model je hezká hračka, ale bez reálnějšího využití. Projekt zeromq obsahuje dva systémy, které jsou naprogramovány pomocí actor modelu - discovery service zyre a broker malamute. Pro zopakování z minula, CLASS projekty se dělí na dvě základní části. Sdílená knihovna (libmlm.so) a démon (malamute), který spouští actor mlm_server. Tento model je extrémně flexibilní, protože umožňuje snadný vývoj, testování i integraci do libovolného kódu. V zásadě je smyčka pokus/omyl je extrémně krátká a zároveň vývojář nepotřebuje znát LD_PRELOAD hacky jako cwrap, socket_wrapper a podobně. Spuštění samotného brokeru potom vypadá zhruba takto ...
    #include <malamute.h>
    ...
        char *endpoint = "inproc://@/malamute";
        zactor_t *server = zactor_new (mlm_server, "Malamute");
        if (verbose)
            zstr_sendx (server, "VERBOSE", NULL);
        zstr_sendx (server, "BIND", endpoint, NULL);
    
        while (true) {
            char *str = zstr_recv (server);
            if (str) {
                puts (str);
                zstr_free (&str);
            }
            else {
                zsys_info ("Interrupted");
                break;
            }
        }
    
        zactor_destroy (&server);
    
    Celý malamute potom běží jako actor, který ovšem na některé formy komunikace spouští další actory. Stejně tak klientská část je actor, takže i přes poměrně jednoduché API člověk má program, kde beží a spolupracuje několik vláken. Ovšem o malamute až nekdy příště.        

    Hodnocení: 100 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    xkucf03 avatar 2.1.2017 23:51 xkucf03 | skóre: 46 | blog: xkucf03
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    Díky za článek.

    Jen bych chtěl říct, že asynchronní přístup a posílání zpráv má i své stinné stránky – člověk přichází o klasický stack trace, ze kterého je u synchronních programů vidět, odkud bylo co voláno a v debuggeru se člověk dostane i do příslušného kontextu a celkem snadno zjistí, proč byla zavolána ta která metoda a proč právě s těmito parametry. Z vlastní zkušenosti musím říct, že porozumět asynchronnímu kódu a pochopit architekturu/návrh programu je těžší – člověk hodí zprávu do jakési roury na jednom konci programu a ona za chvíli přistane na druhém konci a zároveň se zamíchá s jinými zprávami… Ladit takové systémy není zrovna triviální. Jsou tu tedy nějaké doporučené postupy – jak to co nejvíc zpřehlednit a usnadnit pochopení ostatním (a svému budoucímu já)? (protože psaní takových programů se někdy nejde vyhnout)
    Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-Výuka.cz, Nekuřák.net
    5.1.2017 05:33 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    Ladit takové systémy není zrovna triviální. Jsou tu tedy nějaké doporučené postupy – jak to co nejvíc zpřehlednit a usnadnit pochopení ostatním (a svému budoucímu já)? (protože psaní takových programů se někdy nejde vyhnout)
    Tak zrovna ohledně zeromq a actorů, tak postup je takový, že si člověk navrhne schéma a typ zpráv. Potom se postaví prototyp, který se otestuje na očekávaný výkon. No a pak se řeší binární formáty dat a podobně. V zásadě postup je rychlá iterace pokus/omyl a unit testy. Právě actor model a zprojekt k takovému stylu vývoje přímo vybízí.

    Ladit takové programy v debuggeru nelze (s výjimkou code dumpu). Jediná metoda jsou ladící výpisy. Výhoda je v tom, že při rychlém iterativním vývoji člověk napáchá pár chyb na jejichž řešení si na ta správná místa musí přidat ladící výpisy.

    Potom jsou obecnější rady, jako mít plně dokumentované a otestované API, nesdílet stav mezi komponentami a podobně.
    When your hammer is C++, everything begins to look like a thumb.
    7.1.2017 13:59 arsinoe
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    to je takovy evolucni pristup

    to pak neni divu, ze ten vas sw ma obcas nejake to slepe strevo ci sitnici naruby, ze?
    8.1.2017 07:22 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    Ano, slepá střeva máme. A to jak z evolučních, tak i z dob inteligentního designu. Narozdíl od evoluce taky máme potřebu a schopnosti slepé cesty odstraňovat.
    When your hammer is C++, everything begins to look like a thumb.
    oryctolagus avatar 10.1.2017 13:20 oryctolagus | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    Ladit takové programy v debuggeru nelze (s výjimkou code dumpu).
    Počítám, že na tyhle věci by se dal nasadit koncept Time traveling debuggeru, to by mohlo fungovat velmi pěkně. (Ačkoli implementace by asi nebyla úplně triviální.)
    There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
    Josef Kufner avatar 10.1.2017 19:22 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model
    Ladicí výpisy jsou taková primitivní forma time traveling debuggeru. Tedy pokud je z nich možné alespoň částečně rekonstruovat stav aplikace.

    Implementace debuggeru není nijak komplikovaná. Potřebuješ do mechanismu na předávání zpráv vložit odbočku a logovat vše, co se posílá. Zbytek už je jen vizualizace nasbíraných dat (což může být docela komplikované samo o sobě). Když se to udělá hezky, tak se z logu dá třeba poskládat film (avi), kde je zachycen běh programu. Nebo si můžeš nechat nakreslit různé (sekvenční) diagramy. Nástrojů, které převedou nějakou jednoduchou syntaxi na obrázek je spousta (např. Graphviz). Pokud je zpráv hodně, tak to nemusí být moc interaktivní a rendrování může chvilku trvat, ale dá se.
    Hello world ! Segmentation fault (core dumped)
    11.5.2017 10:30 happy wheels
    Rozbalit Rozbalit vše Re: Co nás ph naučil 3: actor model

    Založit nové vláknoNahoru

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