2013-06-04 13 views
5

Po pewnym wysiłku udało mi się skonfigurować serwer wielowątkowy PHP, który odbiera dane z wielu WebSockets i przekazuje je do pojedynczego gniazda TCP. Dokonałem tego z pthreads i udało mi się wykorzystać obiekt Stackowaty jako tablicę.różnica między wątkami, pracownikami, Mutex, stackable?

Następnym krokiem jest teraz, aby naprawdę zrozumieć, co robię i zdecydowanie, co mogę zrobić lepiej. Czytałem gdzieś tutaj na SO, że wielowątkowość nie jest czymś, co po prostu "zrobić". Z tego powodu lubię kopać głębiej, zanim przejdę do kodowania. Sprowadza mnie do następujących pytań:

Co rozumie się przez A Worker Thread has a persistent state (pthreads.org). Czy pracownik nadal będzie działał, gdy będzie poza zakresem? Jaki jest ich stosunek do Stackables?

W podręczniku PHP napisano, że wątki robocze powinny być używane w wątkach, dlaczego?

Mam nadzieję, że moje pytanie nie jest szerokie.

Odpowiedz

13

Wątek roboczy ma stan trwały: po uruchomieniu wątku roboczego pracownik jest dostępny do wykonania, dopóki zmienna nie zniknie z zakresu lub pracownik zostanie zamknięty.

Weź przykład skryptu, który pobiera wiele stron z wielu źródeł w trybie online: w niewielkiej skali możesz uciec i może to być najlepszy projekt do obsługi wielu wątków, każdy wątek ma do czynienia z pojedynczym żądaniem i przetwarzanie treści. Zwykle jednak należy uznać za ogromne marnotrawstwo, aby rozpocząć wątek w celu złożenia pojedynczego żądania lub wykonać coś bardzo prostego, zamiast tego uruchomi się tylu pracowników, ilu będzie mógł zarządzać twój sprzęt i środowisko, oraz zaimplementuj żądanie i przetwarzanie treści. jako możliwy do układania w stosy. Podczas korzystania z Workers, każde żądanie nie kosztuje zainicjowania wątku wątków. Trwałość w tym kontekście odnosi się do faktu, że każdy ze stackables może odczytać $ this-> worker i uzyskać dostęp do wszystkich/dowolnych zakresów globalnych (w tym klasy statycznej), więc z punktu widzenia Stackowalności w trakcie realizacji kontekst Robotnik nie ustępuje, w rzeczywistości Stackables po prostu dzielą się kontekstem.

Mutex i Cond są dla osób uzależnionych od gwintów posix, i do moich celów podczas opracowywania samego pthreadsa. Normalni użytkownicy nie powinni tak naprawdę korzystać z tej funkcji, choć jest to również udokumentowane jako odpowiednik funkcji posix, a znaczna część oryginalnej dokumentacji nadal obowiązuje (z warstwą rozsądku na górze). Mutex i Cond są cienkimi opakowaniami wokół znanej funkcjonalności i nie są skierowane na Joe Bloggs.

Zgaduję, że zastanawiasz się, czy muteks są wymagane do bezpiecznego czytania i pisania obiektów, tak nie jest, bezpieczeństwo jest wbudowane w pthreads.

Czasy, w które powinieneś używać wątku nad robotnikiem; z przykładu, w małej skali. Dodatkowo, jeśli masz sprzęt do obsługi, wątki mogą tworzyć Workers (i wątki), co pozwala na bardziej złożone możliwości projektowania systemów. Możesz również okazać się niesamowity, w takim przypadku możesz zaprogramować swoje wątki, aby działały jak pracownicy bez obciążania obiektu inicjalizacją (stackables) dla każdego zadania. Pracownik jest wątkiem, tylko niektóre funkcje wątku zostały przesłonięte, aby wykonać listę stackables, zauważysz subtelne różnice w metodach synchronizacji wątku i pracownika, co nie ma znaczenia, jeśli używasz pracowników zgodnie z przeznaczeniem . Jeśli jednak Twoja awesomeness doprowadzi cię do przekonania, że ​​lepiej jest unikać standardowego modelu, to będziesz potrzebował synchronizacji z obiektu Thread, aby zaimplementować wzorzec Worker w PHP.

Faktem jest, że jeśli patrzysz na wątki, chcesz robić więcej niż 2 lub 3 rzeczy naraz, istnieje szansa, że ​​znalazłeś sposób na zrobienie kilku rzeczy. Zatem zapewnienie funkcjonalności Worker/Stackable jako części pakietu pthreads ma sens, ponieważ lepiej nadaje się do wykonywania kilku rzeczy w oddzielnych kontekstach, pisanie tych rzeczy w PHP (nawet przy pomocy pthreadów) byłoby trudne.

+0

Dziękujemy! to jest ogromna pomoc. Podczas gdy mój kod działał, jestem daleko poza torem. Nadal zastanawiam się, kiedy użyjesz zwykłego obiektu Thread. – marlonp33

+1

Okay, zaktualizowałem odpowiedź kilkoma moimi informacjami na temat wątku ... mam nadzieję, że to w pełni odpowiada na twoje pytanie. –

+0

Musiałem przeczytać to wiele razy, aby zrozumieć, co mówisz. ale dzięki! – Nerrve

Powiązane problemy