2011-09-20 10 views
8

Mam przełożonego z N procesów roboczych. Jak zwykle, przełożony może wysłać wiadomość do procesu roboczego i istnieje handle_cast, która wysyła odpowiedź od pracownika do przełożonego.Kierownik projektu Erlang: jak sprawdzić, czy wszyscy pracownicy odpowiedzieli

Jak mogę sprawdzić, czy dokładnie wszyscy N pracownicy odpowiedzieli przełożonemu? Czy można to zrealizować przy pomocy wszelkiego rodzaju obsługi zdarzeń - np. Powiedzieć przełożonemu "Ok, wszyscy odpowiedzieli" i nie sprawiać, by przełożony sprawdzał, czy "Wszystkie procesy N odpowiedziały" co sekundę w ETS tabela rejestru dzieci?

Odpowiedz

8

Jeśli mówisz o OTP supervisor, nie możesz wysłać wiadomości do pracownika z niego. Osoba nadzorująca to bardzo ograniczone zachowanie w celu wykonania następujących czynności: , rozpoczynając, monitorowanie, restartowania i zatrzymywania procesów. Nic więcej.

Aby rozwiązać konkretny problem, należy przeprowadzić proces odpowiedzialny za wysłanie wiadomości do wszystkich pracowników. Proces ten może również przechowywać listę wszystkich pracowników w swoim stanie, "odhaczyć" (lub usunąć z listy) pracowników, którzy odpowiedzieli. Możesz to osiągnąć, wyświetlając listę PIDów i otrzymując odpowiedzi z procesów (lub monitorując procesy z erlang:monitor/2, jeśli wychodzą, gdy są gotowe) i sprawdzając, kto został.

3

Alternatywą - która może (lub nie może) dotyczyć Twojego przypadku jest użycie zachowania gen_event.

ZASTRZEŻENIE

mówię „mógł”, ponieważ to zależy od tego, co twoi „pracownicy” zrobić w konkretnym przypadku. Jeśli interesuje Cię treść ich odpowiedzi, możesz nie chcieć stosować tego podejścia, ale w przypadku, gdy jesteś zainteresowany faktem, że wszyscy pracownicy wykonali swoje zadania - na przykład procesy robocze wykonują ciężkie obliczenia i przechowuj ich częściowy wynik w bazie danych, więc jesteś gotowy do połączenia częściowych - gen_event może być drogą do zrobienia.

KONIEC ZASTRZEŻENIE

Więc ...

W OTP, menedżer wydarzenie jest nazwany obiekt, do którego mogą być wysyłane zdarzenia.

Zdarzenia to wiadomości.

W menedżerze zdarzeń jest zero, jedna lub kilka procedur obsługi zdarzeń jest zainstalowanych. Gdy menedżer zdarzeń zostanie powiadomiony o zdarzeniu, zdarzenie zostanie przetworzone przez wszystkie zainstalowane programy obsługi zdarzeń.

Zasadniczo zamiast jednego przełożonego i kilku pracowników masz menedżera zdarzeń i kilka programów do obsługi zdarzeń.

Następnie można użyć funkcji gen_event:sync_notify/2:

sync_notify jest synchroniczna w tym sensie, że nastąpi powrót ok po zdarzenie zostało obsługiwane przez wszystkie obsługi zdarzeń.

Aby uzyskać więcej informacji na temat * gen_event * wyglądać here i there.

Powiązane problemy