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 (před 6 lety) — k47

Včera jsem měl na Po­slední Sobotě před­náškuReact.PHP – klonu node.js na­psa­ném v PHP. React je fra­mework pro asyn­chronní re­ak­tivní pro­gra­mo­vání. Je po­sta­ven na stě­žejní pre­mise, že žádná IO ope­race nikdy ne­blo­kuje a vý­sledný pro­gram je řízený udá­lostmi. Takové apli­kace můžou být velice šká­lo­va­telné, pro­tože ne­po­tře­bují armádu vláken, které by vět­šinu času ne­činně čekaly na do­kon­čení IO ope­rací. React, stejně jako PHP pra­cuje v jednom vlákně, ve kterém běží event loop – ne­ko­nečná smyčka ob­slu­hu­jící níz­ko­úrov­ňové bu­f­fery ope­rač­ního sys­tému. Díky tomu může velice efek­tivně ob­slu­ho­vat de­sítky tisíc spo­jení na­jed­nou1.

Ale o tom teď nechci psát.

Pokud se chcete do­zvě­dět víc jak React fun­guje, do­po­ru­čuji dvě před­nášky, kde tvůrce Reactu Igor Wied­ler, de­tailně vy­svět­luje práci asyn­chron­ního sou­kolí.

Teď se chci vě­no­vat něčemu jinému.

Po před­nášce (o které si skromně myslím, že se celkem po­da­řila) se sešlo pár dotazů, které by se daly shr­nout jako: Jak to může běžet pa­ra­lelně, když je PHP jenom jed­no­vlák­nové.

Od­po­věď je jed­no­du­chá: pro­gram neběží pa­ra­lelně, ale asyn­chronně a mezi těmito dvěma pojmy je veliký rozdíl.

Slovo pa­ra­lelní zna­mená „sou­běžný, rov­no­běžný, pro­bí­ha­jící sou­časně“.

Na­proti tomu asyn­chronní zna­mená „ne­syn­chro­ni­zo­vaný, ne­sou­dobý, ne­sou­časný, časově ne­sla­děný nebo ne­pro­bí­ha­jící v uve­de­ném pořadí“.

Jak říkal Rob Pike, pa­ra­le­lis­mus vy­po­vídá o pro­vá­dění více věcí na­jed­nou a asyn­chron­nost je zá­le­ži­tost kom­po­zice pro­gramu z ne­zá­visle pro­vá­dě­ných pro­cesů. Asyn­chronní věci můžou pro­bí­hat na jednom vlákně nebo na ně­ko­lika, ale pa­ra­lelní podle de­fi­nice zna­mená, že se vy­ko­nává víc úloh v jeden oka­mžik.

Jediné co v Reactu pro­bíhá pa­ra­lelně jsou IO ope­race, kdy ope­rační systém plní na­jed­nou mnoho bu­f­ferů spo­je­ných s jed­not­li­vými sí­ťo­vými sockety. Ale to není pod­stata věci, pro­tože kdyby se OS v jeden oka­mžik vě­no­val jenom jed­nomu spo­jení, na cho­vání pro­gramu by se nic ne­změ­nilo. Stejně tak by se nic ne­změ­nilo, kdy­bychom asyn­chronní pro­gram začali vy­ko­ná­vat v mno­ho­vlák­no­vém pro­středí2.

Shr­nuto a pod­tr­ženo:

Asyn­chron­nost vy­po­vídá o struk­tuře pro­gramu, pa­ra­le­lis­mus o způ­sobu jeho vy­ko­ná­vání.


Slajdy z před­nášky zde:


1 Na jednom ser­veru se dá zvlád­nout klidně deset mi­li­onů sou­čas­ných spo­jení, ale na to po­tře­buje člověk mnohem víc odvahy. 2 Za před­po­kladu, že všechny ope­race budou ato­mické a vi­di­telné oka­mžitě všem ostat­ním vlák­nům.

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