funkcionálně.cz

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

Paralelismus a asynchronnost



Text komentáře


Filip Procházka (@HosipLan) (2013-06-30 17:36)
Pořád nechápu jednu věc, jak řekneš systému ať něco stahuje, nebo zapisuje, že si zatím půjdeš dělat něco jiného?


paranoiq (2013-06-30 19:34)
otevřeš neblokující socket a čas od času zeptáš, jestli už je hotovo

pokud jde o stahování, jde to i bez Reactu. je pro to podpora rovnou v CURLu - https://github.com/paranoiq/dogma/blob/master/Dogma/Http/ChannelManager.php (zkoušel jsem nejvýš 1000 paralelních vláken)


Honza Tvrdík (2013-07-01 02:52)
Koukni na funkce stream_select & stream_set_blocking. Nicméně napsal pomocí toho něco asynchronně bez nějaké abstrakce je dost nepohodlné. Je to skoro jako psát to v C =)

Zkusil jsem schválně napsat jednoduchý <a href="https://gist.github.com/JanTvrdik/5897869">asynchronní downloader</a>, aby bylo vidět, co přibližně React.PHP dělá (resp. co si tak myslím že asi dělá).


Jakub Vrána (2013-06-30 22:51)
Díky za nasdílení slajdů. Mrzí mě, že jsem na přednášce nebyl. Mám otázku ke slajdům 60 a 61: Existuje způsob, jak <code>flow()</code> přimět k tomu, aby čekal na dvě věci najednou? Třeba bychom chtěli najednou stahovat followers a following. Tedy zavolám <code>fetchProfile()</code>, na to potřebuji počkat. Pak chci zavolat <code>fetchFollowers()</code> a <code>fetchFollowing()</code>, ty na sebe vzájemně čekat nemusí, ale na konci chci vrátit třeba jejich průnik, takže musím počkat na obě. Dalo by se něco takového s <code>flow()</code> napsat?

Zcela nesouvisející věc: Na <code>flow()</code> mi přijde trochu matoucí, že po yieldnutí nePromise generátor dál pokračuje v běhu. Jednak tím pádem neexistuje způsob, jak generátor zastavit a jednak když pak yieldnu něco dalšího, tak dříve yieldnutá hodnota zmizí v propadlišti dějin. Dala by se sémantika z <code>return $recur($x);</code> změnit na <code>return $x;</code>, což by vyřešilo oba problémy?


k47 (2013-07-20 11:45)
Flow je z podstaty sekvenční. Když chci dělat víc věcí najednou, musím použít kombinátor `When::all` (který má signaturu `Array[Promise[X]] => Promise[Array[X]]`)

/---code
$intersection = flow (function () {
list($flwrs, $flwng) = yield When::all(fetchFollowers(), fetchFollowing());
yield array_intersect($flwrs, $flwng);
});
\---

Druhé otázce úplně nerozumím. Generátor můžu zastavit *zevnitř* (buď vyhodím výjimku, nebo kód skončí). Generátor ve `flow` nepředstavuje sekvenci hodnot, ale sekvenci kroků a výpočtů, které vedou k jedné výsledné hodnotě zabalené v `Promise`. Kdybych mohl yieldnout více hodnot, nestačila by mi promise, ale potřeboval bych něco jako Rx Observable.


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