funkcionálně.cz

Přední český blog o funkcionálním programování, kde se o funkcionálním programování nepíše
««« »»»

Paralelismus a asynchronnost

30. 6. 2013 — k47

Včera jsem měl na Poslední Sobotě přednášku o React.PHP - klonu node.js napsaném v PHP. React je framework pro asynchronní reaktivní programování. Je postaven na stěžejní premise, že žádná IO operace nikdy neblokuje a výsledný program je řízený událostmi. Takové aplikace můžou být velice škálovatelné, protože nepotřebují armádu vláken, které by většinu času nečinně čekaly na dokončení IO operací. React, stejně jako PHP pracuje v jednom vlákně, ve kterém běží event loop - nekonečná smyčka obsluhující nízkoúrovňové buffery operačního systému. Díky tomu může velice efektivně obsluhovat desítky tisíc spojení najednou1.

Ale o tom teď nechci psát.

Pokud se chcete dozvědět víc jak React funguje, doporučuji dvě přednášky, kde tvůrce Reactu Igor Wiedler, detailně vysvětluje práci asynchronního soukolí.

Teď se chci věnovat něčemu jinému.

Po přednášce (o které si skromně myslím, že se celkem podařila) se sešlo pár dotazů, které by se daly shrnout jako: Jak to může běžet paralelně, když je PHP jenom jednovláknové.

Odpověď je jednoduchá: program neběží paralelně, ale asynchronně a mezi těmito dvěma pojmy je veliký rozdíl.

Slovo paralelní znamená "souběžný, rovnoběžný, probíhající současně".

Naproti tomu asynchronní znamená "nesynchronizovaný, nesoudobý, nesoučasný, časově nesladěný nebo neprobíhající v uvedeném pořadí".

Jak říkal Rob Pike, paralelismus vypovídá o provádění více věcí najednou a asynchronnost je záležitost kompozice programu z nezávisle prováděných procesů. Asynchronní věci můžou probíhat na jednom vlákně nebo na několika, ale paralelní podle definice znamená, že se vykonává víc úloh v jeden okamžik.

Jediné co v Reactu probíhá paralelně jsou IO operace, kdy operační systém plní najednou mnoho bufferů spojených s jednotlivými síťovými sockety. Ale to není podstata věci, protože kdyby se OS v jeden okamžik věnoval jenom jednomu spojení, na chování programu by se nic nezměnilo. Stejně tak by se nic nezměnilo, kdybychom asynchronní program začali vykonávat v mnohovláknovém prostředí2.

Shrnuto a podtrženo:

Asynchronnost vypovídá o struktuře programu, paralelismus o způsobu jeho vykonávání.


Slajdy z přednášky zde:


1 Na jednom serveru se dá zvládnout klidně deset milionů současných spojení, ale na to potřebuje člověk mnohem víc odvahy. 2 Za předpokladu, že všechny operace budou atomické a viditelné okamžitě všem ostatním vláknům.

@kaja47, kaja47@k47.cz, deadbeef.k47.cz, starší články