Teprve ted jsem zaznamenal, ze tady bezi serial o mem oblibenem Erlangu, predchozi dily mi nejak utekly :) A jeste ke vsemu je to i dobre napsany, super, diky moc!
Jestli muzu drobny doplneni k tomu "posilani synchronnich/asynchronnich" zprav, nekoho by mozna mohlo zajimat, ze posilani zprav v erlangu je vzdycky asynchronni a pokud je potreba synchronni zprava, tak se musi explicitne "rucne" synchronizovat - proces proste ceka na konkretni zpravu, ktera je odpovedi na otazku, kterou odeslal.
Z toho pak plyne to, ze gen_server vlastne mezi doruceni zpravy a jeji zpracovani vklada jednu vrstvu navic, coz muze znemoznit nektery figle, ktery se jinak daji pouzit - napr. pokud proces ceka v receive na nejakou zpravu a dostane jinou, tak se nic nedeje - zprava zustane v mailboxu a ceka se dal, "neocekavana" zprava se zpracuje az pozdejc. Takze pri klasickem receive jde treba zpravy prioritizovat [1]. U gen_serveru tohle pouzit nejde, protoze ten proste prijme jakoukoli zpravu a preda ji ke zpracovani callback modulu. Vypada to jako prkotina, ale nektere veci to muze komplikovat a pokud vim, s gen_serverem se tohle moc neda resit. Na druhou stranu, gen_server (jako takovej, ten modul) neni zadny raketovy inzenyrstvi, takze si clovek muze dle libosti napsat vlastni verzi, klidne i se stejnym protokolem {'$cast' ...}.
V zacatecnickem tutorialu by asi taky stalo za zminku, ze pomoci synchronnich volani se da snadno vytvorit deadlock - staci dva vzajemne se synchronne volajici moduly...
Vzhledem k vzacnosti materialu o Erlangu v cestine je skoda, ze neprobehla trochu zevrubnejsi jazykova korektura, ta spousta chyb zbytecne jinak supr serial snizuje (treba to opakovani "modul co neco dela" - fakt by to chtelo spis "ktery" ;)
Celkove ale clanek i celej serial fakt super, diky moc.
[1] viz napr. http://erlang.org/pipermail/erlang-questions/2007-July/027728.html
S tim mailboxem je taky potreba si dat bacha, aby v nem ty zpravy nevyhnivaly. V anti-defenzivnim Erlangu je receive asi jedine misto, kde se naopak osetrovat nezname stavy (zpravy) musi. Tohle nektere zacatecniky mozna muze trosku prekvapit :-)
Mimochodem, nedavno probehla tahle diskuse:
https://github.com/erlang/otp/pull/481