Click here to load reader
Upload
jakub-nietrzeba
View
220
Download
0
Embed Size (px)
Citation preview
Współbieżność
Jakub Nietrzeba
TAK● Dużo łatwych do wydzielenia odrębnych zadań
– Obliczenia
– Pobieranie plików, dręczenie SOAPa
● Potężny serwer, dużo RAMu● Lepsze zagospodarowanie sprzętu i łącza
NIE● Operacje na bazach danych● Operacje na dysku● Serwery oparte o gniazdka (select!)● Może biblioteka zewnętrzna już to ma? (np. GraphicsMagick do
zdjęć)● Koszty utrzymania rosną!
Komunikacja z wątkiem
● Kolejki komunikatów (msg_get_queue, msg_receive)– Ograniczenia rozmiaru! (do obejścia)
– Autoserializacja (uwaga na klasy!)
– Protip: ftok używa tylko jednego znaku!
● Dzielona pamięć (shmop_open, shmop_read)– „Prawie” plik, bardziej zmienna
– Trzeba synchronizować zapis/odczyt
– Dane muszą mieścić się w pamięci
Komunikacja z wątkiem
● Potoki nazwane (posix_mkfifo)– Zachowują się jak pliki (fread, fwrite)
– Warto używać selecta (stream_select)
– Rozmiar bufora 65KB (1 MB max!)
● Sygnały● Semafory, mutexy
Sposoby
● pthreads● pcntl_fork● proc_open/popen● inne (magia!)
pthreads
● „Prawdziwe” wątki● Pełna gama gotowych klas (Wątki, Workery, Pool…)● Uruchamiane na żądanie, można usypiać, wznawiać● Wymagają rekompilacji PHP● Synchronizacja! Serializacja!● Nie wszystko działa jak powinno
– Kopiowanie uchwytów do zasobów rodzi bugi
– Classloader zanika
pthreads
<?phpclass Watek extends Thread { public function run() { // działamy działamy }}
$w = new Watek();$w->z = 123;$w->start();
pcntl_fork
● Najstarszy mechanizm wątków● Działa wszędzie (czyli nie na Windowsie)● Łatwe w uruchomieniu, trudne w synchronizacji● Robi się trudno gdy chcemy mieć więcej dzieci● Wątek od razu się uruchamia● Komunikacja z wątkiem jest na naszej głowie● Kopiowanie zasobów!● Łase na pamięć
pcntl_fork
<?php
$pid = pcntl_fork();
if($pid < 0) die('Uuuups');if($pid) {
//tu wpadnie w wątku rodzicapcntl_wait($status); //czekamy aż dziecko skończy
} else {//tu się toczy wątek dziecka, działamy!
}
proc_open
● „Prawie” to samo co fork● Uruchamia się nowy proces● Uniwersalne● Łase na pamięć● Bardzo przydatne strumienie wejścia/wyjścia● Skomplikowane uruchamianie i zarządzanie● Nice! (proc_nice)
Magia!
● curl_multi_init● win32service● Demonizacja