Paralelní zpracování (vlákna) v PHP

php
Michal Sobčák

Máme za úkol provést zpracování dat, v co nejkratší době a máme k tomu použít PHP. Hned na začátku víme, že PHP skripty fungují tak, že překladač vezme postupně všechny řádky a začne je zpracovávat od prvního řádku až do posledního.


Dejme tomu, že někde ve prostřed bude jednoduchý cyklus for(), který bude zpracovávat naše data. Už při letmém zkouknutí skriptů, vidíme, že pokud budeme zpracovávat např. 10000 záznamů, tak ten poslední se provede při poslední (či-li 10000 cyklu for). Než, ale k tomuto cyklu dojde musí se provést těch předchozích 9999 a to nějakou dobu trvá, řekněmě 10 sekund. Ale, jak provést tu samou práci za polovinu času

Odpovědí je paralelní zpracování. Co si pod paralelním zpracování můžeme představit? Jedná se o proces, kde jsou jednotlivé vlákna na sobě nezávislé a každé z nich zpracovává jiné data.


Takový krásný příklad je například při opravě auta, jeden technik, musí vyměnit pneumatiky a zkontrolovat olej v autě a vyměnit jej. Pokud to bude dělat sám a každá z jeho prací mu zabere 1 hodinu, tak celkově bude provádět práci 2 hodiny. Pokud budou auto opravovat 2 technici (paralelní zpracování) stejnou práci svedou za 1 hodinu.


A takto to funguje i u vláknech v php. (Vlákno v PHP si lze představit, jako jednoho technika). K tomu, abychom mohly využívat vlákna je zapotřebí mít povolenou knihovnu (PCNTL), která je ve většině případech vypnutá. Pouze u skriptů spouštící se před CGI nebo cron je povolena.

Samozřejmě využítí paralelního zpracování je širší. Jedno vláknou může připravovat data (uloží je např. do tabulky a druhé vlákno si data z tabulky vezme a zpracuje je). Počet vláken není limitován, ale je potřeba si uvědomit, že s počtem vláken rostou systémové požadavky.


Krásný příklad při použítí vláken by se dal demonstrovat, při rozesílce emailových kampaní. Pokud budeme používat standartní zpracování, tak sql dotazem si zjistíme, že musíme odeslat 1000 mailů. Což nějaký čas potrvá. K dispozici máme IP adresy, které jsou určeny pro rozesílku. Proč tedy nevyužít všech 5 IP adres zároven? Aby jsme byly spravedlivý spočítáme kolik mailů, rozešle každá IP adresa (1000/5 = 200) a pomocí paralelního zpracováníodešleme před 5 IP adres 200 mailů.

Čas jsme snížili na 1/5, bohužel paměťová nároky vzrostly. Proto je potřeba používat vlákna v php s rozvahou.



Michal Sobčák - Programátor

Náš senior. Tolik let praxe a stovky úspěšných projektů. Michal programoval ještě než byly ty internety. Někdy ve svých článcích na tu doby rád vzpomíná. 

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie.